繁体   English   中英

$setUnion 合并来自多个文档的数组 MongoDB

[英]$setUnion to merge array from multiple documents MongoDB

我在集合中有如下文档:

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

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

我用来查找id 1 和 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}

这似乎只是id 1 的数据。

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

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 ]
}

只需对s1使用$last而不是$first

所以查询变成:

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 ] }

您可以将$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()

操场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM