【问题标题】:Mongodb sum the size of array fieldsMongodb求和数组字段的大小
【发布时间】:2015-07-26 00:28:52
【问题描述】:

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

{

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

  "typ": "Organisation",

}

我想找出与“组织”类型的文档相关联的 foos 的总体大小

所以我有这个聚合查询

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

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

喜欢:

{ "_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 玩了 arround,但不知道如何与我的查询结合,我只会遇到语法错误,如果知道这是否可能会很酷

【问题讨论】:

    标签: mongodb


    【解决方案1】:

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

    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
    }
    

    【讨论】:

    • 请注意_id 字段不是必需的。
    • @MarkusWMahlberg 感谢您的关注。
    • 哇,非常感谢它就像一个魅力!我需要在 $match 查询中包含 "foos":{$ne:null} 才能使其正常工作
    • @johnSmith 不错!很高兴这一切最终都为你解决了
    • 超过:aggregate([ { "$match": { "typ": "Organisation" } }, { $group: { _id: "", "total": {$sum: {$size: "$foos"}}}}]
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-01-11
      • 2012-05-13
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      • 2021-01-09
      相关资源
      最近更新 更多