MongoDB 带总和的嵌套查找
MongoDB nested lookup with sum
我需要从数据库中检索整个单个对象层次结构作为 JSON。并同时从 3 级嵌套集合中求和。
地点
{"_id": "2", "name": "name2"}
{"_id": "3", "name": "name3"}
{"_id": "4", "name": "name4"}
{"_id": "5", "name": "name5"}
用户
{"_id": "u2", "name": "u2", venue_id: "2"}
{"_id": "u3", "name": "u3", venue_id: "2"}
{"_id": "u4", "name": "u4", venue_id: "3"}
{"_id": "u5", "name": "u5", venue_id: "4"}
显示
{"_id": "s2", "name": "s2", host_id: "u2", "duration": 20}
{"_id": "s3", "name": "s3", host_id: "u2", "duration": 50}
{"_id": "s4", "name": "s4", host_id: "u2", "duration": 60}
{"_id": "s5", "name": "s5", host_id: "u4", "duration": 30}
我需要检索所有场地以及用户与该场地相关联的演出持续时间总和。
产出
{"_id": "2", "name": "name2", "duration": 130}
{"_id": "3", "name": "name3", "duration": 30}
{"_id": "4", "name": "name4", "duration": 0}
{"_id": "5", "name": "name5", "duration": 0}
如果您要进行“嵌套”查找,您可能想得过于复杂了。 2 个简单的 $lookup
应该足以满足您的需要。做最后的 $group
以获得预期的结果。
db.venue.aggregate([
{
"$lookup": {
"from": "user",
"localField": "_id",
"foreignField": "venue_id",
"as": "userLookup"
}
},
{
"$unwind": {
path: "$userLookup",
preserveNullAndEmptyArrays: true
}
},
{
"$lookup": {
"from": "show",
"localField": "userLookup._id",
"foreignField": "host_id",
"as": "showLookup"
}
},
{
"$unwind": {
path: "$showLookup",
preserveNullAndEmptyArrays: true
}
},
{
$group: {
_id: "$_id",
name: {
$first: "$name"
},
duration: {
$sum: "$showLookup.duration"
}
}
}
])
这里是Mongo playground供大家参考。
我需要从数据库中检索整个单个对象层次结构作为 JSON。并同时从 3 级嵌套集合中求和。
地点
{"_id": "2", "name": "name2"}
{"_id": "3", "name": "name3"}
{"_id": "4", "name": "name4"}
{"_id": "5", "name": "name5"}
用户
{"_id": "u2", "name": "u2", venue_id: "2"}
{"_id": "u3", "name": "u3", venue_id: "2"}
{"_id": "u4", "name": "u4", venue_id: "3"}
{"_id": "u5", "name": "u5", venue_id: "4"}
显示
{"_id": "s2", "name": "s2", host_id: "u2", "duration": 20}
{"_id": "s3", "name": "s3", host_id: "u2", "duration": 50}
{"_id": "s4", "name": "s4", host_id: "u2", "duration": 60}
{"_id": "s5", "name": "s5", host_id: "u4", "duration": 30}
我需要检索所有场地以及用户与该场地相关联的演出持续时间总和。
产出
{"_id": "2", "name": "name2", "duration": 130}
{"_id": "3", "name": "name3", "duration": 30}
{"_id": "4", "name": "name4", "duration": 0}
{"_id": "5", "name": "name5", "duration": 0}
如果您要进行“嵌套”查找,您可能想得过于复杂了。 2 个简单的 $lookup
应该足以满足您的需要。做最后的 $group
以获得预期的结果。
db.venue.aggregate([
{
"$lookup": {
"from": "user",
"localField": "_id",
"foreignField": "venue_id",
"as": "userLookup"
}
},
{
"$unwind": {
path: "$userLookup",
preserveNullAndEmptyArrays: true
}
},
{
"$lookup": {
"from": "show",
"localField": "userLookup._id",
"foreignField": "host_id",
"as": "showLookup"
}
},
{
"$unwind": {
path: "$showLookup",
preserveNullAndEmptyArrays: true
}
},
{
$group: {
_id: "$_id",
name: {
$first: "$name"
},
duration: {
$sum: "$showLookup.duration"
}
}
}
])
这里是Mongo playground供大家参考。