आपकी त्रुटि को पुन:उत्पन्न नहीं कर सकता लेकिन आपके प्रश्न में कुछ "टाइपो" हैं, इसलिए मैं सुनिश्चित नहीं कर सकता कि आपके पास वास्तव में क्या है।
लेकिन मान लें कि आप वास्तव में MongoDB 2.6 या इसके बाद के संस्करण के साथ काम कर रहे हैं तो आप शायद चाहते हैं। $setIntersection
या $setIsSubset
ऑपरेटर के बजाय $setUnion
. वे ऑपरेटर उस सरणी की सामग्री को "मिलान" करते हैं जिसकी उनकी तुलना की जाती है, जहां $setUnion
बस आपूर्ति की गई सरणी को मौजूदा के साथ जोड़ती है:
db.people.aggregate([
{ "$project": {
"first_name": 1,
"last_name": 1,
"sticky": {
"$size": {
"$setIntersection": [ "$offices", [ "FL", "SC" ]]
}
},
"offices": 1
}},
{ "$sort": {
"sticky": -1,
"last_name": 1
}}
])
पिछले संस्करणों में जहां आपके पास वे सेट ऑपरेटर
नहीं हैं आप बस $unwind
का उपयोग कर रहे हैं
सरणी के साथ काम करने के लिए, और उसी तरह का $cond
$group
यह सब वापस एक साथ लाने के लिए:
db.people.aggregate([
{ "$unwind": "$offices" },
{ "$group": {
"_id": "$_id",
"first_name": { "$first": "$first_name" },
"last_name": { "$first": "$last_name",
"sticky": { "$sum": { "$cond": [
{ "$or": [
{ "$eq": [ "$offices": "FL" ] },
{ "$eq": [ "$offices": "SC" ] },
]},
1,
0
]}},
"offices": { "$push": "$offices" }
}},
{ "$sort": {
"sticky": -1,
"last_name": 1
}}
])
लेकिन आप निश्चित रूप से सही रास्ते पर थे। अपनी सटीक आवश्यकता प्राप्त करने के लिए बस सही सेट ऑपरेशन या अन्य विधि चुनें।
या जब से आप जो चाहते हैं उसे प्राप्त करने का अपना तरीका पोस्ट कर चुके हैं, तो उस तरह का "आदेशित मिलान" लिखने का एक बेहतर तरीका यह है:
db.people.aggregate([
{ "$project": {
"first_name": 1,
"last_name": 1,
"sticky": { "$cond": [
{ "$anyElementTrue": {
"$map": {
"input": "$offices",
"as": "o",
"in": { "$eq": [ "$$o", "FL" ] }
}
}},
2,
{ "$cond": [
{ "$anyElementTrue": {
"$map": {
"input": "$offices",
"as": "o",
"in": { "$eq": [ "$$o", "SC" ] }
}
}},
1,
0
]}
]},
"offices": 1
}},
{ "$sort": {
"sticky": -1,
"last_name": 1
}}
])
और यह प्राथमिकता देगा कि यह "कार्यालयों" के साथ "एससी" पर "एफएल" युक्त और इसलिए अन्य सभी पर, और एक ही क्षेत्र में ऑपरेशन कर रहा है। लोगों के लिए यह देखना भी बहुत आसान होना चाहिए कि $अनविंड करें
सेट ऑपरेटरों के बिना पुराने संस्करणों में। जहां आप $cond
बयान।