Поиск MongoDB $во вложенном документе
Я новичок в монго и изо всех сил борюсь со следующим. У меня есть 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'}}
])
любая помощь была бы очень признательна!
2 ответов
в этом случае требуется хорошая игра с $unwind и $project в aggregation framework
пожалуйста, см. ниже:
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: [],
},