【问题标题】:MongoDB query to get the sum of all document's array field lengthMongoDB查询以获取所有文档的数组字段长度的总和
【发布时间】:2020-10-08 04:51:14
【问题描述】:

下面是一个集合的示例文档,比如“CollectionA”

{
    "_id" : ObjectId("5ec3f19225701c4f7ab11a5f"),
    "workshop" : ObjectId("5ebd37a3d33055331eb4730f"),
    "participant" : ObjectId("5ebd382dd33055331eb47310"),
    "status" : "analyzed",
    "createdBy" : ObjectId("5eb7aa24d33055331eb4728c"),
    "updatedBy" : ObjectId("5eb7aa24d33055331eb4728c"),
    "results" : [ 
        {
            "analyze_by" : {
                "user_name" : "m",
                "user_id" : "5eb7aa24d33055331eb4728c"
            },
            "category_list" : [ 
                "Communication", 
                "Controlling", 
                "Leading", 
                "Organizing", 
                "Planning", 
                "Staffing"
            ],
            "analyzed_date" : ISODate("2020-05-19T14:48:49.993Z"),
        }
    ],
    "summary" : [],
    "isDeleted" : false,
    "isActive" : true,
    "updatedDate" : ISODate("2020-05-19T14:48:50.827Z"),
    "createdDate" : ISODate("2020-05-19T14:47:46.374Z"),
    "__v" : 0
}

我需要查询所有文档以获取“结果”数组长度并返回所有文档“结果”长度的总和。

例如,

文档 1 的“结果”长度 - 5

文档 2 的“结果”长度 - 6

那么输出应该是 11。

我们可以编写一个查询,而不是获取所有,迭代并添加结果长度吗?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    如果我理解清楚,您想投影结果属性的长度。 因此,您应该检查 $size 运算符是否适合您。 https://docs.mongodb.com/manual/reference/operator/aggregation/size/

    【讨论】:

      【解决方案2】:

      您使用带有$sum$size 聚合运算符的聚合分组查询来获取集合中所有文档的数组元素大小的总和。

      db.collection.aggregate( [
        { 
             $group: { 
                 _id: null, 
                 total_count: { $sum: { $size: "$results" } }
             } 
        }
      ] )
      


      使用 Mongoose 的 Model.aggregate() 进行聚合:
      SomeModel.aggregate([
        { 
             $group: { 
                 _id: null, 
                 total_count: { $sum: { $size: "$results" } }
             } 
        }
      ]).
      then(function (result) {
        console.log(result);
      });
      

      【讨论】:

      • 我可以在mongoose中得到这个吗...??
      【解决方案3】:

      您可以使用$group$sum 来计算包含结果数组大小的字段的总大小。要创建字段,您可以使用$addFields 中的$size 计算每个文档中结果的大小并将其放入字段。如下:

      db.getCollection('your_collection').aggregate([
      {
            $addFields: {
               result_length: { $size: "$results"}
            }
         },
         {
         $group: {
              _id: '',
              total_result_length: { $sum: '$result_length' }
          }
          }
      
      ])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-24
        • 1970-01-01
        • 1970-01-01
        • 2023-01-13
        • 2022-08-24
        • 2019-08-23
        • 2022-12-04
        相关资源
        最近更新 更多