MongoDB में, cursor.sort()
विधि उस क्रम को निर्दिष्ट करती है जिसमें क्वेरी मेल खाने वाले दस्तावेज़ लौटाती है।
sort()
विधि एक दस्तावेज़ को स्वीकार करती है जो फ़ील्ड को सॉर्ट करने के लिए निर्दिष्ट करती है, और सॉर्ट ऑर्डर। सॉर्ट क्रम या तो 1
. हो सकता है आरोही या -1
. के लिए उतरने के लिए।
आप { $meta: "textScore" }
. भी निर्दिष्ट कर सकते हैं $text
. करते समय परिकलित 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.find().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.find().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.find().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 funny 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, but definitely not funny...", "date" : ISODate("2021-01-01T00:00:00Z") }
ध्यान दें कि पहली date
फ़ील्ड में दिनांक स्ट्रिंग होती है, जबकि अन्य दो दस्तावेज़ दिनांक ऑब्जेक्ट का उपयोग करते हैं।
यह भी ध्यान दें कि दिनांक स्ट्रिंग में बिल्कुल वही दिनांक है जो दस्तावेज़ 3 में है, और यह दिनांक दस्तावेज़ 2 में दिनांक से बाद की दिनांक है।
आइए date
के अनुसार क्रमित करें उन दस्तावेज़ों के क्षेत्र:
db.posts.find().sort({ date: 1 }).pretty()
परिणाम:
{ "_id" : 1, "title" : "Web", "body" : "Create a funny 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, but definitely not funny...", "date" : ISODate("2021-01-01T00:00:00Z") }
इस मामले में हमने आरोही क्रम में क्रमबद्ध किया, जिसका अर्थ है कि पहले की तारीखें पहले आनी चाहिए। हालांकि, हमारे पहले दस्तावेज़ में दिनांक ऑब्जेक्ट के बजाय दिनांक स्ट्रिंग है, और इसलिए यह पहले आया - भले ही इसकी तिथि दस्तावेज़ 2 में दिनांक से बाद की हो।
यहाँ यह फिर से है, लेकिन अवरोही क्रम में:
db.posts.find().sort({ date: -1 }).pretty()
परिणाम:
{ "_id" : 3, "title" : "Oceans", "body" : "Oceans are wide and vast, but definitely not funny...", "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 funny website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z" }
एक बार फिर, अलग-अलग डेटा प्रकारों को अपने भीतर अलग से ऑर्डर किया जाता है।
टेक्स्ट स्कोर मेटाडेटा सॉर्ट
आप { $meta: "textScore" }
. का उपयोग कर सकते हैं $text
. का उपयोग करते समय घटते प्रासंगिकता स्कोर के आधार पर छांटने का तर्क खोज।
उदाहरण
db.posts.find(
{ $text: { $search: "funny" } },
{ score: { $meta: "textScore" }}
).sort({ score: { $meta: "textScore" } }
).pretty()
परिणाम:
{ "_id" : 2, "title" : "Animals", "body" : "Animals are funny things...", "date" : ISODate("2020-01-01T00:00:00Z"), "score" : 0.6666666666666666 } { "_id" : 3, "title" : "Oceans", "body" : "Oceans are wide and vast, but definitely not funny...", "date" : ISODate("2021-01-01T00:00:00Z"), "score" : 0.6 } { "_id" : 1, "title" : "Web", "body" : "Create a funny website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z", "score" : 0.5833333333333334 }
इस उदाहरण में, हमने { $meta: "textScore" }
. द्वारा क्रमबद्ध किया है .
MongoDB 4.4 से वह लाइन जो जाती है { score: { $meta: "textScore" }}
वैकल्पिक है। इसे छोड़ देने से score
निकल जाएगा परिणामों से क्षेत्र। इसलिए, हम निम्नलिखित कार्य कर सकते हैं (MongoDB 4.4 से):
db.posts.find(
{ $text: { $search: "funny" } }
).sort({ score: { $meta: "textScore" } }
).pretty()
परिणाम:
{ "_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, but definitely not funny...", "date" : ISODate("2021-01-01T00:00:00Z") } { "_id" : 1, "title" : "Web", "body" : "Create a funny website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z" }
$text
कर रहे हैं इस तरह की खोजों के लिए आवश्यक है कि हमने एक टेक्स्ट इंडेक्स बनाया है। यदि नहीं, तो एक IndexNotFound
त्रुटि लौटा दी जाएगी।
अधिक जानकारी
अधिक जानकारी के लिए MongoDB दस्तावेज़ देखें।