Найти вложенный документ по идентификатору на основе значения в родительском
Учитывая, что у меня есть документ следующей структуры:
{
selectedId: ObjectId("57b5fb2d7b41dde99009bc75"),
children: [
{_id: ObjectId("57b5fb2d7b41dde99009bc75"), val: 10},
{_id: ObjectId("57b5fb2d7b41dde99009bc75"), val: 20},
]
}
где родительское значение selectedId всегда ссылается на один из дочерних идентификаторов, как мне получить дочерний вложенный документ, где _id = selectedId?
Я попытался:
parentModel.findOne({'selectedId': 'this.children._id'})
однако, как я теперь знаю, вторая строка принимается за литерал. Итак, как мне ссылаться на родительское поле в запросе?
Редактировать: очевидно, это можно сделать с помощью двух запросов, получая значение "selectedId" родителя, а затем снова запрашивая. Тем не менее, я хочу сделать это в одном запросе.
1 ответ
Вы можете использовать структуру агрегации, в частности использовать $arrayElemAt
а также $filter
операторы для возврата дочернего вложенного документа. Следующий пример показывает это:
parentModel.aggregate([
{
"$project": {
"children": {
"$arrayElemAt": [
{
"$filter": {
"input": "$children",
"as": "item",
"cond": {
"$eq": ["$$item._id", "$selectedId"]
}
}
}, 0
]
}
}
}
]).exec(callback);