Mongodb总和了数组字段的大小

时间:2015-05-14 11:42:15

标签: mongodb

所以我有一堆简单的文件,比如

{

  "foos": [
    ObjectId("5105862f2b5e30877c685c58"),
    ObjectId("5105862f2b5e30877c685c57"),
    ObjectId("5105862f2b5e30877c685c56"),
  ],

  "typ": "Organisation",

}

我希望找出“组织”类型文档的关联foos的总体大小

所以我有这个聚合查询

db.profil.aggregate(
   [
   {
    $match:{
     "typ":"Organisation"
    }
   },
      {
         $project: {
            fooos: { $size: "$foos" }
         }
      }
   ]
)

这将返回每个文档的所有foos的计数

喜欢:

{ "_id" : ObjectId("50e577602b5e05e74b38a6c8"), "foooos" : 1 }
{ "_id" : ObjectId("51922170975a09f363e3eef5"), "foooos" : 3 }
{ "_id" : ObjectId("51922170975a09f363e3eef8"), "foooos" : 2 }
{ "_id" : ObjectId("5175441d975ae346a3a8dff2"), "foooos" : 0 }
{ "_id" : ObjectId("5192216f975a09f363e3eee9"), "foooos" : 2 }
{ "_id" : ObjectId("5192216f975a09f363e3eeeb"), "foooos" : 3 }
{ "_id" : ObjectId("5192216f975a09f363e3eee4"), "foooos" : 2 }
{ "_id" : ObjectId("5192216f975a09f363e3eee6"), "foooos" : 2 }
{ "_id" : ObjectId("5192216f975a09f363e3eedb"), "foooos" : 2 }
{ "_id" : ObjectId("51922174975a09f363e3ef4a"), "foooos" : 1 }
{ "_id" : ObjectId("5192216f975a09f363e3eee1"), "foooos" : 1 }
{ "_id" : ObjectId("5192216e975a09f363e3eed7"), "foooos" : 2 }
{ "_id" : ObjectId("5192216f975a09f363e3eeee"), "foooos" : 3 }

是否有一些查询会返回所有文件的foos的总计数?

我使用$ sum玩了一下但不知道如何结合我的查询,我只会得到语法错误,知道这是否可能会很酷

2 个答案:

答案 0 :(得分:28)

$group步骤之后包含$project运算符管道阶段,如下所示:

db.profil.aggregate([
   { "$match":{ "typ": "Organisation" } },
   { "$project": {
         "fooos": { "$size": "$foos" }
   } },
   { "$group": {
       "_id": null,
       "count": {
           "$sum": "$fooos"
       }
   } }
])

这将对上一个$project阶段的所有输入文档进行分组,并在组中的fooos字段上应用累加器表达式$sum以获取总数(使用上一个示例) :

这也可以通过将$project管道传递为:

来完成
db.profil.aggregate([
   { "$match": { "typ": "Organisation" } },
   { "$group": {
       "_id": null,
        "count": {
            "$sum": { "$size": "$foos" }
        }
    } }
])

<强>输出

/* 0 */
{
    "result" : [ 
        {
            "_id" : null,
            "count" : 24
        }
    ],
    "ok" : 1
}

答案 1 :(得分:11)

我知道这是一个老问题,但如果你愿意,你可以完全绕过项目,那么这个怎么样?

db.profil.aggregate([
{
    "$match":{ "typ": "Organisation" }
},
{
    "$group":
    {
        "_id": null,
        "count":
        {
            "$sum": { "$size": "$foos" }
        }
    }
}])

输出保持不变,似乎(稍微)更快。