我在集合中有如下文档:
{ _id : 1 , data : [7,4,0] }
{ _id : 2 , data : [4,5,6] }
{ _id : 3 , data : [6,7,8] }
我想从两个或多个文档中合并data
数组。
我用来查找data
1和2 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()
但查询结果为:
{7, 5, 0}
似乎只是id
1的数据。
如何在同一个数组上实现两个或多个文档之间的并集 场?
PS:我使用的是MongoDB 3.4
答案 0 :(得分:14)
要获得更有效的查询,请使用 $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 ]
}
答案 1 :(得分:1)
仅对$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 ] }
答案 2 :(得分:0)
您可以将 $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()