$ setUnion从多个文件MongoDB合并数组

时间:2017-02-17 07:31:41

标签: mongodb mongodb-query aggregation-framework

我在集合中有如下文档:

{ _id : 1 , data : [7,4,0] }
{ _id : 2 , data : [4,5,6] }
{ _id : 3 , data : [6,7,8] }

我想从两个或多个文档中合并data数组。

我用来查找data 1和2 id数组的并集的查询是:

db.coll.aggregate(
{
    $match : {
        _id: { $in: [1, 2] }
    }
},
{
    $group: { 
        _id: 0,
        s0: { $first: "$data"}, 
        s1: { $first: "$data"}
    }
},
{
    $project: {
        _id: 0,
        ans: { $setUnion: [ "$s0","$s1"]}
    }
}
).pretty()

但查询结果为:

{7, 5, 0}

似乎只是id 1的数据。

  

如何在同一个数组上实现两个或多个文档之间的并集   场?

PS:我使用的是MongoDB 3.4

3 个答案:

答案 0 :(得分:14)

要获得更有效的查询,请使用 $reduce 运算符展平数组。这将允许您连接任意数量的数组,因此,不仅仅是从文档1和2执行两个数组的并集,这也适用于其他数组。

考虑运行以下聚合操作:

db.coll.aggregate([
    { "$match": { "_id": { "$in": [1, 2] } } },
    {
        "$group": {
            "_id": 0,
            "data": { "$push": "$data" }
        }
    },
    {
        "$project": {
            "data": {
                "$reduce": {
                    "input": "$data",
                    "initialValue": [],
                    "in": { "$setUnion": ["$$value", "$$this"] }
                }
            }
        }
    }
])

示例输出

{
    "_id" : 0,
    "data" : [ 0, 4, 5, 6, 7 ]
}

答案 1 :(得分:1)

仅对$last

使用$first而不是s1

所以查询变为:

db.coll.aggregate(
{
    $match : {
        _id: { $in: [1, 2] }
    }
},
{
    $group: { 
        _id: 0,
        s0: { $first: "$data"}, 
        s1: { $last: "$data"}
    }
},
{
    $project: {
        _id: 0,
        ans: { $setUnion: [ "$s0","$s1"]}
    }
}
).pretty()

输出:

{ "ans" : [ 0, 4, 5, 6, 7 ] }

答案 2 :(得分:0)

您可以将 $unwind$group$addToSet 一起使用,

  • $match 你的条件
  • $unwind 解构 data 数组
  • $group by null 并执行 $addToSet 以从 data
  • 中获取唯一编号
db.coll.aggregate([
  { $match: { _id: { $in: [1, 2] } } },
  { $unwind: "$data" },
  {
    $group: {
      _id: null,
      data: { $addToSet: "$data" }
    }
  }
]).pretty()

Playground