子文档

时间:2017-12-12 16:40:04

标签: node.js mongodb mongoose

我有以下架构:

{
    _id: 1,
    post: 'content',
    comments: [
        {
            id: 1,
            items: ['<other_doc_id',...] // assume 3 items
        },
        {
            id: 2,
            items: ['<other_doc_id',...] // assume 2 items
        }
    ]
}

我想计算集合中所有文档的项目数,就像在上面的场景中它应该返回5,如果我们有另一个文档具有相同的注释,那么它应该返回10。

更新 这是我的样本数据

"comments": [
    {
        "id": {
            "$oid": "5a201f6d7295d76514a69a7c"
        },
        "_id": {
            "$oid": "5a2e84cc9735111c147a359f"
        },
        "tags": [
            {
                "$oid": "5a251acb6eba8810f97e7abc"
            },
            {
                "$oid": "5a251ae66eba8810f97e7abd"
            }
        ],
        "items": [
            {
                "$oid": "5a201f767295d76514a69a7d"
            },
            {
                "$oid": "5a2512a1dc9a8c106c82226d"
            }
        ]
    }
],

QUERY

posts.aggregate([{
    "$project": {
        "count": {
            "$sum": {
                "$map": {
                    "input": "comments",
                    "as": "result",
                    "in": {
                        "$size": "$$result.items"
                    }
                }
            }
        }
    }
}]);

1 个答案:

答案 0 :(得分:3)

您可以使用$map计算文档注释数组中每个项目的$size,然后$sum计算所有尺寸。

db.collection_name.aggregate([
  {
    "$project": {
      "count": {
        "$sum": {
          "$map": {
            "input": "$comments",
            "as": "result",
            "in": {
              "$size": "$$result.items"
            }
          }
        }
      }
    }
  }
])