我是mongo的新手,并且正在努力与以下人员进行斗争。我有2个收集结构如下。对于我的生活,我无法弄清楚如何对学校集合进行$ lookup。阅读其他帖子,我肯定使用ObjectId作为参考和外国领域。
以下是我的结构:
校友:
{
"_id": "john",
"items": [
{
"name": "John",
"items": [
{
"school": ObjectId("56de35ab520fc05b2fa3d5e4"),
"grad": true
},
{
"school": ObjectId("56de35ab520fc05b2fa00000"),
"grad": false
}
]
},
{
"name": "Johnny"
// notice no nested items, this doc should still be included in result
},
{
"name": "Jon",
"items": [
{
"school": ObjectId("56de35ab520fc05b2fa11111"),
"grad": false
}
]
}
]
}
学校
{
_id: ObjectId("56de35ab520fc05b2fa3d5e4"),
name: "Some University",
street: "ABC Boulevard"
}
我想要得到的东西:
{
"_id": "john",
"items": [
{
"name": "John",
"items": [
{
"school": ObjectId("56de35ab520fc05b2fa3d5e4"),
"grad": true,
"schoolInfo": {
_id: ObjectId("56de35ab520fc05b2fa3d5e4"),
name: "Some University",
street: "ABC Boulevard"
}
},
{
"school": ObjectId("56de35ab520fc05b2fa00000"),
"grad": true,
"schoolInfo": {
_id: ObjectId("56de35ab520fc05b2fa00000"),
name: "Another University",
street: "123 Boulevard"
}
}
]
},
{
name: "Johnny"
},
{
"name": "Jon",
"items": [
{
"school": ObjectId("56de35ab520fc05b2fa11111"),
"grad": true,
"schoolInfo": {
_id: ObjectId("56de35ab520fc05b2fa11111"),
name: "Some University",
street: "ABC Boulevard"
}
}
]
}
]
}
我试过的查询无效:
db.alumni.aggregate([
{$match: {_id: 'john'}},
{$lookup: {
from: 'schools',
localField: 'items.items.school',
foreignField: '_id',
as: 'schoolInfo'}}
])
非常感谢任何帮助!
答案 0 :(得分:26)
在这种情况下,需要在聚合框架中使用$ unwind和$ project进行一个很好的游戏
请参阅以下内容:
A
了解它是如何工作的 - 尝试从查询中删除聚合阶段并检查文档结构。
答案 1 :(得分:5)
这会更好地处理db.alumni.aggregate([
{$match: {_id: 'john'}},
{$unwind:"$items"},
{$unwind:"$items.items"},
{$lookup: {
from: 'schools',
localField: 'items.items.school',
foreignField: '_id',
as: 'schoolInfo'}},
{$unwind:"$schoolInfo"},
{$group:{
_id: {
_id: '$_id',
name: '$items.name',
},
items: {
$push: {
'grad': '$items.items.grad',
'school': '$schoolInfo._id'
'schoolInfo': '$schoolInfo'
}
}
}},
{$group:{
_id: '$_id._id',
items: {
$push: {
'name': '$_id.name',
'items': '$items'
}
}
}}
]).pretty()
阵列中的多所学校吗?
$items.items
我没有解决丢失{
name: "Johnny",
items: [],
},
的情况,但您可以查看$unwind empty array
此外,如果没有条目,最好留空数组而不是空,即
{{1}}