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