mongodb - 如何将多个文档中的两个字段数组合并为一个集合?

标签 mongodb aggregation-framework

我有如下所示的 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 并不重要。请注意,array1array2、两者或两者都不能出现在文档中,它们甚至可以为空。我尝试了许多聚合和级联查询命令,但无法得出所需的响应。

最佳答案

为此,您需要使用 .aggregate() 方法,该方法提供对聚合管道的访问。

管道中的第一阶段使用 $match使用 $exists 运算符过滤掉 array1array2 都不存在的文档运算符和 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/

相关文章:

python - 如何在Flask中访问MongoDB实例

node.js - 我如何使用 Express 构建对 MongoDB 3+ 的获取请求

查找后的MongoDB聚合项目

mongodb - mongo $slice 查询反向索引超出范围

mongodb - 与 updateMulti mongooperation 等效的 AbstractMongoEventListener 方法是什么

java - 在 Spring MVC 中 Autowiring MongoRepository

arrays - 数组中的特征项

node.js - 如何使用 MongoDb 在 NodeJS 中获取收件箱的 session 用户及其最后消息

javascript - SailsJS 和 MongoDB 聚合框架与自定义查询有关的问题

java - 带有 Java 驱动程序的 MongoDB 聚合