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