Агрегация MongoDB: поиск объекта дочернего массива - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть записи в коллекции следующего формата.

СТУДЕНТ

[
    {
        "name" : "student A",
        "type" : 1,
        "results" : [ 
            {
                "position" : 1,
                "percent" : 90,
                "test_id" : ObjectId("aaaa")
            }, 
            {
                "position" : 2,
                "percent" : 88,
                "test_id" : ObjectId("bbbb")
            }
        ]
    },
    {
        "name" : "student B",
        "type" : 1,
        "results" : [
            {
                "position" : 2,
                "percent" : 56,
                "test_id" : ObjectId("bbbb")
            }
        ]
    }
]

ТЕСТ :

{
    "_id" : ObjectId("aaaa"),
    "name" : "Test A",
},
{
    "_id" : ObjectId("bbbb"),
    "name" : "Test B",
}

Это мой требуемый вывод, Условие: Test.name = "Test A"

[
    {
        "name" : "student A",
        "type" : 1,
        "results" : [ 
            {
                "position" : 1,
                "percent" : 90,
                "test" : {
                    "_id" : ObjectId("aaaa"),
                    "name" : "Test A",
                }
            }, 
            {
                "position" : 2,
                "percent" : 88,
                "test" : {
                    "_id" : ObjectId("bbbb"),
                    "name" : "Test B",
                }
            }
        ]
    }
]

Я пробовал различные комбинации агрегатов, раскрутки и проекта, но все еще могу ' Я вполне понимаю, что буду признателен за любые предложения.

1 Ответ

1 голос
/ 07 февраля 2020

Этот конвейер должен работать для вас:

[{
    $match: {
        name: "student A"
    }
}, {
    $unwind: {
        path: "$results"
    }
}, {
    $lookup: {
        from: 'TEST',
        localField: 'results.test_id',
        foreignField: '_id',
        as: 'results.test'
    }
}, {
    $group: {
        _id: "$name",
        name: {
            $first: "$name"
        },
        type: {
            $first: "$type"
        },
        results: {
            $push: "$results"
        }

    }
}]

Вот скриншоты вашего конвейера, чтобы вы могли видеть, что происходит на каждом этапе: pipeline part 1 pipeline part 2

Если вы хотите избавиться от лишних полей, вы можете добавить этап проекта.

...