嵌套文档上的MongoDB$查找
我是mongo的新手,正在努力解决以下问题。我有两个集合结构如下。就我个人而言,我不知道如何在学校藏品上查找$lookup。在阅读其他帖子时,我肯定会使用ObjectId作为参考,同时也会用到国外领域 以下是我的结构: 校友:嵌套文档上的MongoDB$查找,mongodb,mongodb-query,Mongodb,Mongodb Query,我是mongo的新手,正在努力解决以下问题。我有两个集合结构如下。就我个人而言,我不知道如何在学校藏品上查找$lookup。在阅读其他帖子时,我肯定会使用ObjectId作为参考,同时也会用到国外领域 以下是我的结构: 校友: { "_id": "john", "items": [ { "name": "John", "items": [ { "
{
"_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'}}
])
任何帮助都将不胜感激 在这种情况下,需要在聚合框架中使用$unwind和$project 请参阅下文:
db.alumni.aggregate([
{$match: {_id: 'john'}},
{$unwind:"$items"},
{$unwind:"$items.items"},
{$lookup: {
from: 'schools',
localField: 'items.items.school',
foreignField: '_id',
as: 'schoolInfo'}},
{$unwind:"$schoolInfo"},
{$project:{
"_id":1,
"items":[{
"name":"$items.name",
"items":[{
"school":"$schoolInfo._id" ,
"grad":"$items.items.grad" ,
"schoolInfo":"$schoolInfo"
}]
}]
}}
]).pretty()
要了解它的工作原理,请尝试从查询和检查文档结构中删除聚合阶段。这样会更好地处理
$items.items
数组中的多个学校吗
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: [],
},
可能的副本非常有用,非常感谢!通过一步一步地使用你的答案,我学到了很多。但是,我已经更新了我的问题,以澄清$items.items可以在该数组中包含多个学校。我尝试了您的方法,在$items.items有多个文档的情况下,它似乎会单独返回文档。我想这需要以某种方式重新组合。另外,我注意到,如果$items没有嵌套的$items.items,则会跳过整个外部文档。非常感谢你的帮助。我最初使用mongo的几天,这个场景教会了我很多!ThxAny对此有何更新?我面临着与您在评论中描述的相同的问题。聚会有点晚,但不是直接放松,而是使用附加的子键PreserveNullandEmptyArray来防止空元素崩溃$展开:{path:$schoolInfo',preserveNullAndEmptyArrays:true}