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

Ana*_*via 3 mongodb mongodb-query aggregation-framework

我在一个集合中有文件如下:

{ _id : 1 , data : [7,4,0] }
{ _id : 2 , data : [4,5,6] }
{ _id : 3 , data : [6,7,8] }
Run Code Online (Sandbox Code Playgroud)

我想data从两个或更多文档中联合数组.

我用来查找1和2 data数组的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()
Run Code Online (Sandbox Code Playgroud)

但查询结果如下:

{7, 5, 0}
Run Code Online (Sandbox Code Playgroud)

这似乎id只是1 的数据.

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

PS:我正在使用MongoDB 3.4

chr*_*dam 17

要获得更有效的查询,请使用$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"] }
                }
            }
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

样本输出

{
    "_id" : 0,
    "data" : [ 0, 4, 5, 6, 7 ]
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您希望结果数组中具有唯一值,则可以使用 $addToSet 而不是 $push。 (3认同)