Aggregate, lookup и addField из вложенного массива - PullRequest
0 голосов
/ 03 ноября 2018

У меня проблема с запросом MongoDB. Во-первых, у меня есть « testScriptResultCollection » со структурой ниже:

{
    testCaseId: x
    testScriptId: 1
    descripttion: aaa

}
{
    _id: 2
    testCaseId: x
    testScriptId: 2
    descripttion: bbb
}
{
    _id: 3
    testCaseId: x
    testScriptId: 3
    descripttion: ccc
}

, а другая коллекция - "testCaseCollection" :

{
    _id: 1
    testCaseId: x
    testScripts: [
        {
            testScriptId: 1
            name: testScript1_Name
        },
        {
            testScriptId: 2
            name: testScript2_Name
        }
        {
            testScriptId: 3
            name: testScript3_Name
        }
    ]
}

Мне нужно извлечь объект вроде:

 [ 
        {
            testCaseId: x
            testScriptId: 1
            descripttion: aaa
            name: testScript1_Name
        },
        {
            testCaseId: x
            testScriptId: 2
            descripttion: bbb
            name: testScript2_Name
        },
        {
            testCaseId: x
            testScriptId: 3
            descripttion: ccc
            name: testScript3_Name
        },
    ]

Я попытался выполнить запрос, чтобы найти 2 коллекции с "testCaseId" и найти "имя" testScriptId таким образом, но это не так

testScriptResultCollection.aggregate{[
    {
        $match: {testCaseId : x}
    },
    {
            $lookup:
            {
                from: "testCaseCollection"
                localField: "testCaseId",
                foreignField: "testCaseId",
                as: "combineResults"
            }
    },
    {
        $addFields : 
        {
            "name": {
                $filter: { 
                    input: "$combineResults.testScripts",
                    as: "testScriptArr",
                    cond: { $eq: ["$$testScriptArr.testScriptId", $testScriptId]}
                }
            }
        }
    }
]}

Может кто-нибудь мне помочь. Любая помощь будет оценена. Большое спасибо.

1 Ответ

0 голосов
/ 03 ноября 2018

Вы можете попробовать ниже агрегации

В основном вам нужно использовать $mergeObjects для объединения обоих объектов коллекции и, наконец, $replaceRoot для их перемещения в верхний уровень.

db.getCollection('testCaseCollection').aggregate([
  { "$unwind": "$testScripts" },
  { "$lookup": {
    "from": "testScriptResultCollection",
    "localField": "testScripts.testScriptId",
    "foreignField": "testScriptId",
    "as": "newField"
  }},
  { "$unwind": "$newField" },
  { "$replaceRoot": { "newRoot": { "$mergeObjects": ["$newField", "$testScripts"] }}}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...