Слияние записи двух отдельных коллекций с использованием агрегата - PullRequest
0 голосов
/ 03 июля 2018

У меня есть две отдельные коллекции, скажем, collA и collB. Оба имеют некоторые общие поля, скажем, fieldA, fieldB, fieldC доступны в обеих коллекциях.

db.getCollection('collA').aggregate([
    {
        "$match":{
            // Some filter condition
        }
    },
    {
        "$project":{
            "_id":1,
            "fieldA":1,
            "fieldB":1,
            "fieldC":1
        }
    }
]);

Предположим, я получаю 10 записей от collA

db.getCollection('collB').aggregate([
    {
        "$match":{
            // Some filter condition
        }
    },
    {
        "$project":{
            "_id":1,
            "fieldA":1,
            "fieldB":1,
            "fieldC":1
        }
    }
]);

Предположим, я получаю 5 записей из collB

Теперь я хочу объединить эти 15 записей и выполнить другие агрегатные операции, такие как $ group и многие другие.

Есть ли способ сделать это с агрегацией mongoDB или любым другим альтернативным вариантом?

Предположим, ниже схема для обеих коллекций

CollA
{
    fieldA : String,
    fieldB : String
    fieldC : String
    fieldD : String
}


CollB
{
    fieldA : String,
    fieldB : String
    fieldC : String
    fieldE : String
}

1 Ответ

0 голосов
/ 03 июля 2018

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

Здесь, во-первых, вам нужно поместить $limit, чтобы получить один документ из совокупного собрания ... Затем $facet для обработки нескольких конвейеров агрегации в пределах одной стадии. на том же наборе входных документов ... Теперь необходимо выполнить агрегацию $lookup, чтобы получить данные из других коллекций с ограничением 5 и 10 ... Конкат двух массивов, получаемых из $facet, используя $concatArrays, а затем просто $unwind и замените его новым корнем data, используя $replaceRoot

db.collection.aggregate([
  { "$limit": 1 },
  { "$facet": {
    "collectionA": [
      { "$lookup": {
        "from": Collection.name,
        "pipeline": [
          { "$limit": 5 }
        ],
        "as": "collectionA"
      }},
      { "$project": { "collectionA": 1, "_id": 0 }},
      { "$unwind": "$collectionA" },
      { "$replaceRoot": { "newRoot": "$collectionA" } }
    ],
    "collectionB": [
      { "$lookup": {
        "from": Collection.name,
        "pipeline": [
          { "$limit": 10 }
        ],
        "as": "collectionB"
      }},
      { "$project": { "collectionB": 1, "_id": 0 }},
      { "$unwind": "$collectionB" },
      { "$replaceRoot": { "newRoot": "$collectionB" } }
    ]
  }},
  { "$project": {
    "data": {
      "$concatArrays": [ "$collectionA", "$collectionB" ]
    }
  }},
  { "$unwind": "$data" },
  { "$replaceRoot": { "newRoot": "$data" } }
  // Here you can perform your other operations //
])
...