最簡單的這三個使用聚合的是交叉點**。對於一般的情況下,可以使用聚合像這樣做:
交叉路口:
db.colors.aggregate([
{'$unwind' : "$left"},
{'$unwind' : "$right"},
{'$project': {
value:"$left",
same:{$cond:[{$eq:["$left","$right"]}, 1, 0]}
}
},
{'$group' : {
_id: {id:'$_id', val:'$value'},
doesMatch:{$max:"$same"}
}
},
{'$match' :{doesMatch:1}},
]);
另外兩個變得有點更靠譜。據我所知,沒有辦法將同一文件中的兩個單獨字段組合在一起。在$ project管道階段有一個$ add,$ combine或$ addToSet會很好,但這不存在。所以我們能做的最好的就是說是否有某些東西相互交叉。
db.colors.aggregate([
{'$unwind' : "$left"},
{'$unwind' : "$right"},
{'$project': {
left:"$left",
right:'$right',
same:{$cond:[{$eq:["$left","$right"]}, 1, 0]}
}
},
{'$group' : {
_id:{id:'$_id', left:'$left'},
right:{'$addToSet':'$right'},
sum: {'$sum':'$same'},
}
},
{'$project': {
left:{val:"$_id.left",inter:"$sum"},
right:'$right',
}
},
{'$unwind' : "$right"},
{'$project': {
left:"$left",
right:'$right',
same:{$cond:[{$eq:["$left.val","$right"]}, 1, 0]}
}
},
{'$group' : {
_id:{id:'$_id.id', right:'$right'},
left:{'$addToSet':'$left'},
sum: {'$sum':'$same'},
}
},
{'$project': {
right:{val:"$_id.right",inter:"$sum"},
left:'$left',
}
},
{'$unwind' : "$left"},
{'$group' : {
_id:'$_id.id',
left:{'$addToSet':'$left'},
right: {'$addToSet':'$right'},
}
},
]);
上的問題提供的樣本這種聚合會給這樣的結果:
{
"_id" : 1,
"left" : [
{
"val" : "green",
"inter" : 1
},
{
"val" : "red",
"inter" : 0
}
],
"right" : [
{
"val" : "blue",
"inter" : 0
},
{
"val" : "green",
"inter" : 1
}
]
}
從這裏我們可以通過添加得到交點以下我們可以用下面的開始都聚集到聚合:
{'$project': {
left:"$left"
}
},
{'$unwind' : "$left"},
{'$match' : {'left.inter': 1}},
{'$group' : {
_id:'$_id',
left:{'$addToSet':'$left'},
}
},
我們可以通過將以下內容添加到基本聚合的末尾來找到差異以及相關補充:
![enter image description here](https://i.stack.imgur.com/zORkh.png)
{'$unwind' : "$left"},
{'$match' : {'left.inter': 0}},
{'$unwind' : "$right"},
{'$match' : {'right.inter': 0}},
{'$group' : {
_id:'$_id',
left:{'$addToSet':'$left'},
right:{'$addToSet':'$right'},
}
},
遺憾的是,似乎沒有要到來自不同領域對不同的項目結合起來的好方法。爲了得到工會,最好從客戶那裏做到這一點。或者,如果您想過濾,請分別在每一組上進行。
這個問題的靈感來自於這[答案](http://stackoverflow.com/a/17266323/311525)。我發現了幾個具體的案例,但沒有找到我正在尋找的一般案例。 – Scott
[使用MongoDB聚合在同一文檔中查找兩個集合的交集]的可能重複(http://stackoverflow.com/questions/17264017/use-mongodb-aggregation-to-find-set-intersection-of-two -sets-within-the-same-doc) – WiredPrairie
@WiredPrairie,考慮到你鏈接的是我的,我可以向你保證他們不是重複的問題。你鏈接到的是一個非常特殊的情況下找到一個子集。這是一個更廣泛的關於交叉點,工會和差異的更廣泛的案例問題。 – Scott