Bạn có thể làm điều này với khung tổng hợp, mặc dù nó không dễ dàng. Rắc rối nằm ở chỗ không có $in
toán tử như một phần của khung tổng hợp. Vì vậy, bạn phải kết hợp theo chương trình từng mục trong mảng, điều này sẽ rất lộn xộn. chỉnh sửa :được sắp xếp lại để kết quả khớp là đầu tiên, trong trường hợp $in
giúp bạn lọc ra một phần tốt.
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
);
kết quả đầu ra:
{
"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
}
Bạn có thể để lại matches
trường ra khỏi kết quả nếu bạn bỏ nó ra khỏi $project
ở phần cuối.