来自两个数组的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版本发布。