Sử dụng khung tổng hợp để có được kết quả mong muốn. Tổng hợp toán tử tập hợp điều đó sẽ làm nên điều kỳ diệu là $setIntersection
.
Quy trình tổng hợp sau đây đạt được những gì bạn đang có:
db.test.aggregate([
{
"$match": {
"_id": { "$in": [1, 3] }
}
},
{
"$group": {
"_id": 0,
"set1": { "$first": "$set" },
"set2": { "$last": "$set" }
}
},
{
"$project": {
"set1": 1,
"set2": 1,
"commonToBoth": { "$setIntersection": [ "$set1", "$set2" ] },
"_id": 0
}
}
])
Đầu ra :
/* 0 */
{
"result" : [
{
"set1" : [1,2,3,4,5],
"set2" : [1,2,5,10,22],
"commonToBoth" : [1,2,5]
}
],
"ok" : 1
}
CẬP NHẬT
Để ba hoặc nhiều tài liệu được giao nhau, bạn cần $reduce
toán tử để làm phẳng các mảng. Điều này sẽ cho phép bạn cắt bất kỳ số lượng mảng nào, vì vậy thay vì chỉ thực hiện giao nhau của hai mảng từ tài liệu 1 và 3, điều này cũng sẽ áp dụng cho nhiều mảng.
Xem xét chạy hoạt động tổng hợp sau:
db.test.aggregate([
{ "$match": { "_id": { "$in": [1, 3] } } },
{
"$group": {
"_id": 0,
"sets": { "$push": "$set" },
"initialSet": { "$first": "$set" }
}
},
{
"$project": {
"commonSets": {
"$reduce": {
"input": "$sets",
"initialValue": "$initialSet",
"in": { "$setIntersection": ["$$value", "$$this"] }
}
}
}
}
])