以下是我的mongodb结构:
[{
_id: '111',
items: [{
productId: '123'
}]
}, {
_id: '222',
items: [{
productId: '123'
}, {
productId: '456'
}]
}, {
_id: '333',
items: [{
productId: '123'
}, {
productId: '456'
}, {
productId: '789'
}]
}]
我希望对productId
进行分组和计数,以便结果为:
[{
productId: '123',
count: 3
}, {
productId: '456',
count: 2
}, {
productId: '789',
count: 1
}]
好吧,我尝试使用这样的aggregation
,但我认为我弄错了:
const aggregatorOpts = [{
$group: {
_id: "$items.productId",
count: { $sum: 1 }
}
}]
Model.aggregate(aggregatorOpts).exec()
我得到了:
result [
{ _id: [ '123' ], count: 1 },
{ _id: [ '123', '456' ], count: 1 },
{ _id: [ '123', '456', '789' ], count: 1 }
]
关于如何进行聚合的任何帮助都可能会受到赞赏,请不要假设模型有任何变化。
提前致谢!
答案 0 :(得分:7)
分组前需要$unwind
项数组:
const aggregatorOpts = [{
$unwind: "$items"
},
{
$group: {
_id: "$items.productId",
count: { $sum: 1 }
}
}
]
Model.aggregate(aggregatorOpts).exec()
给出:
{ "_id" : "789", "count" : 1 }
{ "_id" : "456", "count" : 2 }
{ "_id" : "123", "count" : 3 }
答案 1 :(得分:0)
试试这个。
Model.aggregate([
{
$group: {
_id: '$items.productId',
points: {$count: '$items'}
}
}
]);
这应该有用。