我有一点设计问题。
说我有两个系列:
Colletion A stores apples ( _id , appleName )
Collection B stores apple votes ( _id , apple_id , enum(0,1) )
然后我想基于apple_id返回集合A和集合B的缩减,以将0的值作为主对象的属性返回到1。 (比如得分)
示例数据:
collection一个数组
[{_id : 1, appleName : 'grannySmith'},{_id : 2, appleName : 'greenApple'},{_id : 3, appleName : 'anotherApple'}]
集合B数组
[{_id : 1, appleId : 1, vote : 0}, {_id : 2, appleId : 1, vote : 1}, {_id : 3, appleId : 1, vote : 1}]
从这个我正在寻找收集A以减少B
返回collection一个带有reduce
的数组[{_id : 1, appleName : 'grannySmith', score : 2},{_id : 2, appleName : 'greenApple'},{_id : 3, appleName : 'anotherApple'}]
现在看,它现在从带有链接ID的集合B的减少得分为2
答案 0 :(得分:0)
您可以使用聚合来实现它:
db.apple.aggregate([
{
$lookup: {
from: 'score',
localField: '_id',
foreignField: 'appleId',
as: 'scores',
},
}, {
$unwind: {
path: '$scores',
preserveNullAndEmptyArrays: true,
},
}, {
$group: {
_id: '$_id',
appleName: {
$first: '$appleName',
},
score: {
$sum: '$scores.vote',
}
},
}
])
注意:我在此聚合的第一阶段使用$lookup,您需要使用Mongo 3.2或更高版本才能使用它。