MongoDB में, $sort
एकत्रीकरण पाइपलाइन चरण सभी इनपुट दस्तावेज़ों को क्रमबद्ध करता है और उन्हें क्रमबद्ध क्रम में पाइपलाइन में लौटाता है।
सिंटैक्स
वाक्य रचना इस प्रकार है:
{ $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }
जहां <sort order>
1
. हो सकता है आरोही के लिए, -1
अवरोही के लिए, या { $meta: "textScore" }
परिकलित textScore
. द्वारा क्रमबद्ध करने के लिए मेटाडेटा अवरोही क्रम में।
नमूना डेटा
मान लीजिए हमारे पास pets
. नामक संग्रह है निम्नलिखित दस्तावेजों के साथ:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 } { "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 } { "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 } { "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 }
आरोही क्रम में क्रमित करें
आरोही क्रम में क्रमबद्ध करने के लिए, हम 1
. का उपयोग करते हैं सॉर्ट ऑर्डर के लिए।
नीचे एक क्वेरी का उदाहरण दिया गया है जो $sort
. का उपयोग करती है ऑपरेटर उस संग्रह को weight
. द्वारा क्रमबद्ध करने के लिए फ़ील्ड आरोही क्रम में।
db.pets.aggregate([
{ $sort: { weight: 1 } }
])
परिणाम:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 } { "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 } { "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 } { "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 }
अवरोही क्रम में क्रमबद्ध करें
अवरोही क्रम में क्रमबद्ध करने के लिए, हम -1
. का उपयोग करते हैं सॉर्ट ऑर्डर के लिए।
db.pets.aggregate([
{ $sort: { weight: -1 } }
])
परिणाम:
{ "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 } { "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 } { "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 } { "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
एकाधिक फ़ील्ड के अनुसार क्रमित करें
एक से अधिक फ़ील्ड के आधार पर क्रमित करने के लिए, प्रत्येक फ़ील्ड/सॉर्ट ऑर्डर कॉम्बो को अल्पविराम से अलग करें।
उदाहरण
db.pets.aggregate([
{ $sort: { type: 1, weight: -1, _id: 1 } }
])
परिणाम:
{ "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 } { "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 } { "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 }
इस उदाहरण में, हमने type
. द्वारा क्रमबद्ध किया है फ़ील्ड को पहले आरोही क्रम में, फिर weight
. द्वारा अवरोही क्रम में फ़ील्ड, फिर _id
. द्वारा आरोही क्रम में क्षेत्र।
इसका मतलब यह है कि, यदि एक ही प्रकार के कई पालतू जानवर हैं, तो उन पालतू जानवरों को उनके weight
के अनुसार क्रमबद्ध किया जाता है घटते क्रम में। यदि एक ही प्रकार और वजन दोनों के साथ कई पालतू जानवर हैं, तो उन पालतू जानवरों को _id
द्वारा क्रमबद्ध किया जाता है आरोही क्रम में क्षेत्र। अगर हमने _id
. शामिल नहीं किया होता छँटाई प्रक्रिया में क्षेत्र, फिर एक ही प्रकार और वजन के वे पालतू जानवर किसी भी क्रम में प्रकट हो सकते हैं। हर बार जब हम क्वेरी चलाते हैं तो यह सच होता है। अद्वितीय फ़ील्ड (जैसे _id
. पर सॉर्ट फ़ील्ड के बिना फ़ील्ड), यह पूरी तरह से संभव होगा (यहां तक कि संभावित) कि हर बार क्वेरी चलाने पर परिणाम एक अलग क्रम में वापस आएंगे।
विभिन्न प्रकारों को क्रमबद्ध करना
विभिन्न बीएसओएन प्रकारों के मूल्यों की तुलना करते समय, मोंगोडीबी निम्न तुलना क्रम का उपयोग करता है, निम्नतम से उच्चतम तक:
- मिनकी (आंतरिक प्रकार)
- शून्य
- संख्याएं (इंट्स, लॉन्ग, डबल्स, डेसीमल)
- प्रतीक, स्ट्रिंग
- वस्तु
- सरणी
- बिनडाटा
- ऑब्जेक्ट आईडी
- बूलियन
- तारीख
- टाइमस्टैम्प
- नियमित अभिव्यक्ति
- MaxKey (आंतरिक प्रकार)
मान लीजिए कि हमारे पास निम्नलिखित दस्तावेजों के साथ पोस्ट नामक संग्रह है:
{ "_id" : 1, "title" : "Web", "body" : "Create a website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z" } { "_id" : 2, "title" : "Animals", "body" : "Animals are funny things...", "date" : ISODate("2020-01-01T00:00:00Z") } { "_id" : 3, "title" : "Oceans", "body" : "Oceans are wide and vast...", "date" : ISODate("2021-01-01T00:00:00Z") }
ध्यान दें कि पहली date
फ़ील्ड में दिनांक स्ट्रिंग होती है, जबकि अन्य दो दस्तावेज़ दिनांक ऑब्जेक्ट का उपयोग करते हैं।
यह भी ध्यान दें कि दिनांक स्ट्रिंग में बिल्कुल वही दिनांक है जो दस्तावेज़ 3 में है, और यह दिनांक दस्तावेज़ 2 में दिनांक से बाद की दिनांक है।
आइए $sort
लागू करें date
. तक उन दस्तावेज़ों के क्षेत्र:
db.posts.aggregate([
{ $sort: { date: 1 } }
]).pretty()
परिणाम:
{ "_id" : 1, "title" : "Web", "body" : "Create a website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z" } { "_id" : 2, "title" : "Animals", "body" : "Animals are funny things...", "date" : ISODate("2020-01-01T00:00:00Z") } { "_id" : 3, "title" : "Oceans", "body" : "Oceans are wide and vast...", "date" : ISODate("2021-01-01T00:00:00Z") }
इस मामले में हमने आरोही क्रम में क्रमबद्ध किया, जिसका अर्थ है कि पहले की तारीखें पहले आनी चाहिए। हालांकि, हमारे पहले दस्तावेज़ में दिनांक ऑब्जेक्ट के बजाय दिनांक स्ट्रिंग है, और इसलिए यह पहले आया - भले ही इसकी तिथि दस्तावेज़ 2 में दिनांक से बाद की हो।
यहाँ यह फिर से है, लेकिन अवरोही क्रम में:
db.posts.aggregate([
{ $sort: { date: -1 } }
]).pretty()
परिणाम:
{ "_id" : 3, "title" : "Oceans", "body" : "Oceans are wide and vast...", "date" : ISODate("2021-01-01T00:00:00Z") } { "_id" : 2, "title" : "Animals", "body" : "Animals are funny things...", "date" : ISODate("2020-01-01T00:00:00Z") } { "_id" : 1, "title" : "Web", "body" : "Create a website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z" }
एक बार फिर, अलग-अलग डेटा प्रकारों के कारण दिनांक आदेश देना बेकार हो गया है।
टेक्स्ट स्कोर मेटाडेटा सॉर्ट
आप { $meta: "textScore" }
. का उपयोग कर सकते हैं $text
. का उपयोग करते समय घटते प्रासंगिकता स्कोर के आधार पर छांटने का तर्क खोज।
उदाहरण
db.posts.aggregate(
[
{ $match: { $text: { $search: "funny" } } },
{ $sort: { score: { $meta: "textScore" }, title: -1 } }
]
).pretty()
परिणाम:
{ "_id" : 2, "title" : "Animals", "body" : "Animals are funny things...", "date" : ISODate("2020-01-01T00:00:00Z") }
इस मामले में, केवल एक दस्तावेज़ हमारी क्वेरी से मेल खाता है।
इस उदाहरण में, हमने { $meta: "textScore" }
. द्वारा क्रमबद्ध किया है , फिर title
. द्वारा घटते क्रम में। हमने score
. का इस्तेमाल किया एक मनमाना फ़ील्ड नाम के रूप में, लेकिन इसे क्वेरी सिस्टम द्वारा अनदेखा कर दिया जाता है।
$text
कर रहे हैं इस तरह की खोजों के लिए आवश्यक है कि हमने एक टेक्स्ट इंडेक्स बनाया है। यदि नहीं, तो एक IndexNotFound
त्रुटि लौटा दी जाएगी।
समूहीकृत परिणामों को क्रमित करना
हमारे pets
पर वापस जा रहे हैं संग्रह, हम $sort
. का उपयोग कर सकते हैं $group
. के बाद का चरण किसी विशेष फ़ील्ड में मानों की संख्या के आधार पर दस्तावेज़ों के समूह को छाँटने का चरण।
db.pets.aggregate([
{
$match: { weight: { $lt: 30 } }
},
{
$group: { _id: "$type", count: { $sum: 1 } }
},
{
$sort : { count : -1 }
}
])
परिणाम:
{ "_id" : "Cat", "count" : 3 } { "_id" : "Dog", "count" : 2 }
हालांकि, बेहतर होगा कि आप $sortByCount
. का उपयोग करें ऐसे मामलों में ऑपरेटर।
अधिक जानकारी
अधिक जानकारी के लिए MongoDB दस्तावेज़ देखें।