Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
$setUnion用于合并来自多个文档MongoDB的数组_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

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

$setUnion用于合并来自多个文档MongoDB的数组,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我收集了以下文件: { _id : 1 , data : [7,4,0] } { _id : 2 , data : [4,5,6] } { _id : 3 , data : [6,7,8] } 我想合并两个或多个文档中的数据数组 我用于查找id1和2的data数组的并集的查询是: db.coll.aggregate( { $match : { _id: { $in: [1, 2] } } }, { $group: { _id: 0,

我收集了以下文件:

{ _id : 1 , data : [7,4,0] }
{ _id : 2 , data : [4,5,6] }
{ _id : 3 , data : [6,7,8] }
我想合并两个或多个文档中的
数据
数组

我用于查找
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

只需使用
$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 ] }

要获得更高效的查询,请使用操作符展平数组。这将允许您合并任意数量的数组,因此不只是合并文档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 ]
}

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

  • $match
    您的条件
  • $unwind
    解构
    数据
    数组
  • $group
    按null键,执行
    $addToSet
    以从
    数据中获取唯一的数字

谢谢!这很有效。如果我想在两个以上的文档上合并怎么办?如果要合并id为1、2和3的数据,组块是什么?如果要进行交集,则初始值将为空,结果将为空,但输入是嵌套数组。如果要在结果数组中使用唯一值,则可以使用$addToSet而不是$push。
db.coll.aggregate([
  { $match: { _id: { $in: [1, 2] } } },
  { $unwind: "$data" },
  {
    $group: {
      _id: null,
      data: { $addToSet: "$data" }
    }
  }
]).pretty()