我有如下所示的 MongoDB 集合数据:
{ "_id" : "1", "array1" : [ "1", "2" ] },
{ "_id" : "2", "array2" : [ "1", "3" ] },
{ "_id" : "3", "array1" : [ ] },
{ "_id" : "4", "array2" : [ ] },
{ "_id" : "5" },
{ "_id" : "6", "array1" : [ "3", "4" ], "array2" : [ "5" ] }
我想找到一个查询,它只返回单个数组中的唯一数组值,如下所示:
{"_id":"theID", "result":["1", "2", "3", "4", "5"]}
id 并不重要。请注意,array1
、array2
、两者或两者都不能出现在文档中,它们甚至可以为空。我尝试了许多聚合和级联查询命令,但无法得出所需的响应。
最佳答案
为此,您需要使用 .aggregate()
方法,该方法提供对聚合管道的访问。
管道中的第一阶段使用 $match
使用 $exists
运算符过滤掉 array1
和 array2
都不存在的文档运算符和 dot notation .该运算符减少了管道中要处理的文档数量。
下一阶段是 $project
你基本上使用 $setUnion
的地方返回一个数组,其中包含出现在任何数组中的元素;它还会过滤掉结果中的重复元素。也没有使用$ifNull
运算符返回第一个表达式的值或空数组,具体取决于第一个表达式的计算结果是否为空(这里的表达式是“array1”和“array2”)。
从那里,您需要使用 $unwind
对“数组”字段进行反规范化。运算符(operator)。
在管道的最后阶段你 $group
并使用 $addToSet
返回唯一值数组的累加器运算符。
db.getCollection('collection').aggregate([
{ "$match": {
"$or": [
{ "array1.0": { "$exists": true } },
{ "array2.0": { "$exists": true } }
]
}},
{ "$project": {
"arrays": {
"$setUnion": [
{ "$ifNull": [ "$array1", [] ] },
{ "$ifNull": [ "$array2", [] ] }
]
}
}},
{ "$unwind": "$arrays" },
{ "$group": {
"_id": null,
"arrays": { "$addToSet": "$arrays" }
}}
] )
产生:
{ "_id" : null, "arrays" : [ "5", "3", "1", "4", "2" ] }
关于mongodb - 如何将多个文档中的两个字段数组合并为一个集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31885995/