![](/img/trans.png)
[英]MongoDB group documents by id and merge matching array elements from the documents
[英]$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.