Агрегируйте, ищите из 2 коллекций и извлекайте результат - PullRequest
0 голосов
/ 06 ноября 2018

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

[
    {
        _id: 1,
        testCaseId: 'x',
        testScriptId: 1,
        createById: 1
    },
    {
        _id: 2,
        testCaseId: 'x',
        testScriptId: 2,
        createById: 2
    }
]

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

[
    {
        _id: 1,
        testCaseId: x,
        testScripts: [
            {
                testScriptId: 1,
                testScriptName: 'testScript1_Name'
            },
            {
                testScriptId: 2,
                testScriptName: 'testScript2_Name'
            }
        ]
    }
]

и последняя коллекция - "membersCollection"

[
    {
        _id: 1,
        userName: 'John'
    },
    {
        _id: 2,
        userName: 'Mark'
    }
]

Мне нужно извлечь результат поиска каждой записи в "testScriptResultCollection" из "testCaseCollection" ( testCaseId и testScriptId , чтобы получить testScriptName ) и membersSollection ( userId для получения userName

Я хочу получить вот такой результат:

 [ 
        {
            _id: 1,
            testCaseId: 'x',
            testScriptId: 1,
            createById: 1,
            testScriptName: 'testScript1_Name',
            userName: 'John'
        },
        {
            _id: 2,
            testCaseId: 'x',
            testScriptId: 2,
            createById: 2,
            testScriptName: 'testScript2_Name',
            userName: 'Mark'
        },
    ]

Я пробовал запрос, подобный ссылке ниже, но это не лучший способ сделать это. https://mongoplayground.net/p/dGdPGV3GEQn

Может ли кто-нибудь помочь мне? Большое спасибо.

1 Ответ

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

Вы можете использовать ниже оптимизированный конвейер агрегации

db.testScriptResultCollection.aggregate([
  { "$match": { "testCaseId": "x" }},
  { "$lookup": {
    "from": "testCaseCollection",
    "let": { "testScriptId": "$testScriptId" },
    "pipeline": [
      { "$match": { "$expr": { "$in": ["$$testScriptId", "$testScripts.testScriptId"] }}},
      { "$unwind": "$testScripts" },
      { "$match": { "$expr": { "$eq": ["$$testScriptId", "$testScripts.testScriptId"] }}},
      { "$project": { "testScripts": 1, "_id": 0 }}
    ],
    "as": "tr"
  }},
  { "$lookup": {
    "from": "membersCollection",
    "let": { "createById": "$createById" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": ["$$createById", "$_id"] }}}
    ],
    "as": "user"
  }},
  { "$addFields": {
    "testScriptName": { "$arrayElemAt": [ "$tr.testScripts.testScriptName", 0 ] },
    "userName": { "$arrayElemAt": ["$user.userName", 0] }
  }},
  { "$project": { 'user': 0, "tr": 0 }}
])
...