जैसा कि उल्लेख किया गया है, मुझे आशा है कि आपके दस्तावेज़ों में वास्तव में एक सरणी है, लेकिन यदि $elemMatch आपके लिए काम कर रहा है तो उन्हें करना चाहिए।
किसी भी दर पर, आप खोज का उपयोग करके किसी सरणी में किसी तत्व द्वारा सॉर्ट नहीं कर सकते हैं। लेकिन एक मामला है जहां आप का उपयोग करके ऐसा कर सकते हैं। .एग्रीगेट ()
:
db.collection.aggregate([
// Match the documents that you want, containing the array
{ "$match": {
"nlp.entities": {
"$elemMatch": {
"text": "Neelie Kroes",
"type": "Person"
}
}
}},
// Project to "store" the whole document for later, duplicating the array
{ "$project": {
"_id": {
"_id": "$_id",
"url": "$url",
"nlp": "$nlp"
},
"entities": "$nlp.entities"
}},
// Unwind the array to de-normalize
{ "$unwind": "$entities" },
// Match "only" the relevant entities
{ "$match": {
"entities.text": "Neelie Kroes",
"entities.type": "Person"
}},
// Sort on the relevance
{ "$sort": { "entities.relevance": -1 } },
// Restore the original document form
{ "$project": {
"_id": "$_id._id",
"url": "$_id.url",
"nlp": "$_id.nlp"
}}
])
तो अनिवार्य रूप से, $match
प्रासंगिक मिलान वाले दस्तावेज़ों के लिए शर्त, फिर आप <का उपयोग करें कोड>$प्रोजेक्ट
मूल दस्तावेज़ को _id
. में "स्टोर" करें फ़ील्ड और $unwind
"इकाई" सरणी की "प्रतिलिपि"।
अगला $match
सरणी सामग्री को केवल उन लोगों के लिए "फ़िल्टर" करता है जो प्रासंगिक हैं। फिर आप $sort
लागू करें
"मिलान" दस्तावेज़ों के लिए।
चूंकि "मूल" दस्तावेज़ _id
. के अंतर्गत संग्रहीत किया गया था , आप $project
का उपयोग करते हैं
उस संरचना को "पुनर्स्थापित" करने के लिए जिसे दस्तावेज़ को वास्तव में शुरू करना था।
इस प्रकार आप किसी सरणी के अपने मिलान किए गए तत्व पर "क्रमबद्ध" करते हैं।
ध्यान दें कि यदि आपके पास मूल दस्तावेज़ के लिए एक सरणी के भीतर कई "मिलान" थे, फिर आपको एक अतिरिक्त $समूह
अपना क्रम पूरा करने के लिए "प्रासंगिकता" फ़ील्ड के लिए $max मान प्राप्त करने के लिए चरण।