说我们有以下文档:
{a: 1, b: 2},
{a: 2, b: 0},
{a: 3, b: 1}
我想要一个将返回的查询:
[0, 1, 2, 3]
我想知道是否有办法更快地完成这项工作:
a
,另一次选择b
,然后合并到我的应用中。答案 0 :(得分:4)
您需要$group
我们的文档并使用$push
累加器运算符在集合中返回“a”和“b”数组。
在$project
运算符中,您使用$setUnion
运算符来过滤掉重复项。
db.coll.aggregate(
[
{ "$group": {
"_id": null,
"a": { "$push": "$a" },
"b": { "$push": "$b" }
}},
{ "$project": {
"_id": 0,
"merged": { "$setUnion": [ "$a", "$b" ] }
}}
]
)
产生:
{ "merged" : [ 3, 2, 0, 1 ] }
答案 1 :(得分:1)
你可以使用类似的东西
db.getCollection('yourdocs').aggregate([
{
$project: {
values: [ "$a", "$b" ]
}
},
{
$unwind: "$values"
},
{
$group: {
_id: "distinctValues",
values: {
$addToSet: "$values"
}
}
}
])
将导致
{
"_id" : "distinctValues",
"values" : [
0,
1,
2,
3
]
}
更新:只需阅读您希望它排序,$addToSet
无法保证。如果排序对您至关重要,只需在上面的阶段之后将以下内容添加到聚合管道
{
"$unwind": "$values"
},
{
"$sort": {
"values": 1
}
},
{
"$group": {
_id: "distinctValues",
"values": {
"$push": "$values"
}
}
}