来自两个数组的mongodb聚合计数项
我试图从同一模型中的两个数组中计算项目: 型号:来自两个数组的mongodb聚合计数项,mongodb,mapreduce,mongodb-query,aggregation-framework,Mongodb,Mapreduce,Mongodb Query,Aggregation Framework,我试图从同一模型中的两个数组中计算项目: 型号: {_id:1 name:"fun", objectsTypeA: [ objectId_1 objectId_2 ], objectsTypeB: [ objectId_5 objectId_9 ] }, {_id:2 name:"boring", objectsTypeA: [ objectId_3 objectId
{_id:1
name:"fun",
objectsTypeA: [
objectId_1
objectId_2
],
objectsTypeB: [
objectId_5
objectId_9
]
},
{_id:2
name:"boring",
objectsTypeA: [
objectId_3
objectId_4
],
objectsTypeB: []
}
我试图得到以下结果:
[
{ name:"fun",
id: 1,
count:4
},
{ name:"boring",
id: 2,
count: 2
]
到目前为止,我得到的是:
Object.aggregate([
{$project: {_id:1, name:1, objectsTypeA:1}},
{$unwind:'$objectsTypeA'},
{$group: {
_id: "$name",
taggableId: {$addToSet:'$_id'},
count: { $sum: 1}
}},
], function(err, t){
if (!err){
res.jsonp(t);
}
});
这正是我想要的,但它只适用于我的模型中的两个数组中的一个,如果可能的话,我正在寻找一些关于如何达到这个结果的建议
提前感谢。因为有两个数组,所以您必须
展开两个数组以获得两个数组的计数。试试这个:
Object.aggregate([
{$project:{{u id:1,name:1,objectsTypeA:1,objectsTypeB:1},
{$unwind:'$objectsTypeA'},
{$unwind:'$objectsTypeB'},
{$group:{
_id:“$name”,
taggableId:{$addToSet:'$\u id'},
计数:{$sum:1}
}},
],函数(err,t){
如果(!err){
res.jsonp(t);
}
});
是的,这里肯定有一个聚合
问题,也就是说,如果您尝试展开一个空数组,它的父记录的结果将丢失,因为它认为没有任何内容可展开
因此,现在解决这一问题的最简单方法是:
db.objects.mapReduce(
函数(){
散发(
这个,
{
“名字”:这个名字,
“计数”:this.objectsTypeA.length+this.objectsTypeB.length
}
);
},
函数(){},
{“out”:{“inline”:1}
)
在未来版本的MongoDB中,聚合管道有一个可用的操作符,因此您可以简单地对聚合执行大致相同的操作:
db.objects.aggregate([
{“$project”:{
“名称”:1,
“计数”:{“$add”:[
{“$size”:“$objectsTypeA”},
{“$size”:“$objectsTypeB”}
]}
}}
])
谢谢Neil,我测试了你的建议,它可以继续使用,直到下一个$size版本发布。