Mongodb 如何显示父级相关文档的计数?

Mongodb 如何显示父级相关文档的计数?,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我正在尝试建立一个投票系统,在这个系统中,你可以在一个条目上有X个选项来投票。 我现在构建的查询是在检索条目时,我希望获得条目上每个选项的投票数 我非常清楚我将如何在SQL中实现这一点,但要理解MongoDB中的聚合、查找和组的概念 模型如下所示: 条目 { “_id”:“5fc2765938401a2308e18ac5”, “选择”:[ { “名称”:“第一选项” “_id”:“5fc2765938401a2308e18ac6”, }, { “名称”:“第二选项” “_id”:“5fc2765

我正在尝试建立一个投票系统,在这个系统中,你可以在一个条目上有X个选项来投票。 我现在构建的查询是在检索条目时,我希望获得条目上每个选项的投票数

我非常清楚我将如何在SQL中实现这一点,但要理解MongoDB中的聚合、查找和组的概念

模型如下所示:

条目

{
“_id”:“5fc2765938401a2308e18ac5”,
“选择”:[
{
“名称”:“第一选项”
“_id”:“5fc2765938401a2308e18ac6”,
},
{
“名称”:“第二选项”
“_id”:“5fc2765938401a2308e18are”,
},
{
“名称”:“第三选项”
“_id”:“5fc2765938401a2308e18aef”,
},
],
},
{
“_id”:“5fc2766438401a2308e18ac8”,
“选择”:[
{
“名称”:“其他一些选项”
“_id”:“5fc2766438401a2308e18ac9”,
},
{
“_id”:“5fc2766438401a2308e18aca”,
“名称”:“这也是一个选项”
}
],
}
投票

{
“_id”:“5fc2765938401a2308e18ac5”,
“entryId”:“5fc2765938401a2308e18ac6”
},
{
“_id”:“5fc2765938401a2308e18aer”,
“entryId”:“5fc2765938401a2308e18are”
},
{
“_id”:“5fc2765938401a2308e18ek”,
“entryId”:“5fc2765938401a2308e18ac6”
}
...
我希望输入的结果是这样的

{
  "_id": "5fc2765938401a2308e18ac5",
  "options": [
      {
          "name": "First Option"
          "_id": "5fc2765938401a2308e18ac6",
          "votes": 1,
      },
      {
          "name": "Second Option"
          "_id": "5fc2765938401a2308e18are",
          "votes": 0,
      },
      {
          "name": "Third Option"
          "_id": "5fc2765938401a2308e18aef",
          "votes": 5,
      },
  ],
},
{
  "_id": "5fc2766438401a2308e18ac8",
  "options": [
      {
          "name": "Some other option"
          "_id": "5fc2766438401a2308e18ac9",
          "votes": 3,
      },
      {
          "_id": "5fc2766438401a2308e18aca",
          "name": "This is also an option"
          "votes": 10,
      }
  ],
}
  • $lookup
    要加入
    投票
    集合,请传递本地字段
    optoins.\u id
    和外部字段
    entryId
  • $project
    获取选项投票,
    $map
    迭代
    选项
    数组循环,
    $filter
    获取匹配的
    entryId
    记录,
    $size
    获取返回数组中元素的计数,使用
    $mergeObjects
    合并
    投票
    字段和当前对象

db.entries.aggregate([
  {
    $lookup: {
      from: "votes",
      localField: "options._id",
      foreignField: "entryId",
      as: "votes"
    }
  },
  {
    $project: {
      options: {
        $map: {
          input: "$options",
          as: "a",
          in: {
            $mergeObjects: [
              "$$a",
              {
                votes: {
                  $size: {
                    $filter: {
                      input: "$votes",
                      cond: { $eq: ["$$this.entryId", "$$a._id"] }
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
])