Найти вложенный документ по идентификатору на основе значения в родительском

Учитывая, что у меня есть документ следующей структуры:

{
    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);
Другие вопросы по тегам