आप इसे एकत्रीकरण ढांचे के साथ कर सकते हैं, हालांकि यह आसान नहीं है। समस्या यह है कि कोई $in
नहीं है एकत्रीकरण ढांचे के हिस्से के रूप में ऑपरेटर। तो आपको सरणी में प्रत्येक आइटम को प्रोग्रामिक रूप से मिलान करना होगा, जो बहुत गन्दा हो जाता है। संपादित करें :फिर से व्यवस्थित किया गया ताकि मैच पहले हो, अगर $in
एक अच्छे हिस्से को फ़िल्टर करने में आपकी मदद करता है।
db.test.aggregate(
{$match:{"array.1":{$in:[100, 140,80]}}}, // filter to the ones that match
{$unwind:"$array.1"}, // unwinds the array so we can match the items individually
{$group: { // groups the array back, but adds a count for the number of matches
_id:"$_id",
matches:{
$sum:{
$cond:[
{$eq:["$array.1", 100]},
1,
{$cond:[
{$eq:["$array.1", 140]},
1,
{$cond:[
{$eq:["$array.1", 80]},
1,
0
]
}
]
}
]
}
},
item:{$first:"$array.item"},
"1":{$push:"$array.1"}
}
},
{$sort:{matches:-1}}, // sorts by the number of matches descending
{$project:{matches:1, array:{item:"$item", 1:"$1"}}} // rebuilds the original structure
);
आउटपुट:
{
"result" : [
{
"_id" : ObjectId("50614c02162d92b4fbfa4448"),
"matches" : 2,
"array" : {
"item" : 3,
"1" : [
100,
90,
140
]
}
},
{
"_id" : ObjectId("50614bb2162d92b4fbfa4446"),
"matches" : 1,
"array" : {
"item" : 1,
"1" : [
100,
130,
255
]
}
}
],
"ok" : 1
}
आप matches
को छोड़ सकते हैं यदि आप इसे $project
. से बाहर छोड़ते हैं तो परिणाम से बाहर फ़ील्ड करें अंत में।