Монго агрегация: включить описание значения, хранящегося в другой коллекции - PullRequest
0 голосов
/ 27 июня 2018

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

{
    _id: "00a00680-0e77-11e7-b757-edf2b0aec1f9",
    name: "someFileName.txt",
    numRows: 17,
    statusCode: 10
},
{
    _id: "0653b830-ac06-11e6-b5e3-7f4580599144",
    name: "someOtherFileName.txt",
    numRows: 134,
    statusCode: 12
},
...

и связанная коллекция statusCodes:

{
    statusCode: 10,
    statusCodeDesc, "This is the description for status code 10"
},
{
    statusCode: 12,
    statusCodeDesc, "This is the description for status code 12"
}
...

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

db.getCollection('files').aggregate([
    {$match: {_id: "00a00680-0e77-11e7-b757-edf2b0aec1f9"}},
    { "$project": {
        "id": "$_id",
        "name": "$name",
        "statusCode": "$statusCode"
    }}
])

, который выдает желаемый результат:

{
    _id: "00a00680-0e77-11e7-b757-edf2b0aec1f9",
    name: "someFileName.txt",
    numRows: 17,
    statusCode: 10
}

однако мы хотим включить соответствующее описание статуса из коллекции statusCodes, чтобы получить следующее:

{
    _id: "00a00680-0e77-11e7-b757-edf2b0aec1f9",
    name: "someFileName.txt",
    numRows: 17,
    statusCode: 10,
    statusCodeDesc: "This is the description for status code 10"
}

есть идеи?

1 Ответ

0 голосов
/ 27 июня 2018

Вам нужно $ lookup , чтобы включить значения из другой коллекции. В результате вы получите массив всех соответствующих документов из указанной коллекции, так что вы можете использовать $ unwind , чтобы взять первый (поскольку у вас, вероятно, есть уникальные описания для каждого кода), а затем $project, чтобы получить окончательная форма документа: `

db.files.aggregate([
    {
        $match: {
            _id: "00a00680-0e77-11e7-b757-edf2b0aec1f9"
        }
    },
    {
        $lookup: {
            from: "statusCodes",
            localField: "statusCode",
            foreignField: "statusCode",
            as: "statusCodeDetails"
        }
    },
    {
        $unwind: "$statusCodeDetails"
    },
    {
        $project: {
            _id: 1,
            name: 1,
            numRows: 1,
            statusCode: 1,
            statusCodeDesc: "$statusCodeDetails.statusCodeDesc"
        }
    }
])
...