问题:$setUnion 从多个文档 MongoDB 中合并数组

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

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

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

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

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}

这似乎只是id1 的数据。

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

PS:我使用的是 MongoDB 3.4

解答

要获得更高效的查询,请使用 $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 ]
}
Logo

MongoDB社区为您提供最前沿的新闻资讯和知识内容

更多推荐