首页 > 解决方案 > 如何在嵌入文档中使用“$size”?

问题描述

我很难获得嵌入文档中数组的大小。

给定一个包含一些文档的集合:

{
    "_id": { "$oid": "60e26137600b71f2939ebbe7" },
    "name": "Outer doc",
    "inner_docs": [
        { "name": "one", "vals": [1,2,3,4,5] },
        { "name": "two", "vals": [1,2,3,4] },
        { "name": "three", "vals": [1,2,3] }
    ]
}

通过在聚合中应用一个$project阶段,例如:$size

{
  "outer_num": { "$size": "$inner_docs" },
  "inner_docs.num_vals": { "$size": "$inner_docs.vals" }
}

我得到了结果文档:

{
    "_id": { "$oid": "60e26137600b71f2939ebbe7" },
    "inner_docs": [
        { "name": "one", "num_vals": 3 },
        { "name": "two", "num_vals": 3 },
        { "name": "three", "num_vals": 3 }
    ],
    "outer_num": 3,
}

outer_num是正确的,但num_vals不是,它应该是值543分别。

我该如何解决这个问题?

标签: mongodbmongodb-queryaggregation-framework

解决方案


演示 - https://mongoplayground.net/p/dpsp907E_fa

使用$map

将表达式应用于数组中的每个项目并返回一个包含应用结果的数组。

db.collection.aggregate([
  {
    $project: {
        "outer_num": { $size: "$inner_docs"},
        "inner_docs": {
            $map: {
              input: "$inner_docs",
              as: "doc",
              in: { name: "$$doc.name", num_vals: { $size: [ "$$doc.vals" ] } }
            }
      }
    }
  }
])

推荐阅读