使用汇总合并两个单独集合的记录

时间:2018-07-03 07:32:38

标签: mongodb mongoose aggregation-framework

我有两个单独的集合,比如collA和collB。两者都有一些共同的字段,比如说fieldA,fieldB和fieldC在两个集合中都可用。

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

假设我从collA获得10条记录

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

假设我从collB获得了5条记录

现在,我想做的就是合并这15条记录,并想要执行其他聚合操作,例如$ group等。

有什么方法可以使用mongoDB聚合或任何其他替代选项来做到这一点?

为两个集合假设以下架构

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


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

1 个答案:

答案 0 :(得分:1)

您可以尝试以下汇总

在这里,首先,您需要放入$limit以从聚合集合中获取单个文档...然后$facet来在同一阶段的同一组输入文档上处理多个聚合管道。 ..现在需要执行$lookup聚合以从限制为5和10的其他集合中获取数据...使用$facet然后简单地{{3 }},并使用$concatArrays

将其替换为新的根data
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 //
])