首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从多个数组返回元素数组

从多个数组返回元素数组
EN

Stack Overflow用户
提问于 2015-10-27 14:49:28
回答 1查看 62关注 0票数 2

我有一群像这样的公司。我也想合并其他文件交易。我需要这个:

代码语言:javascript
复制
{ 
    "_id" : ObjectId("561637942d25a7644cae993e"), 
    "locations" : [
        {
            "deals" : [
                {
                    "name" : "1", 
                    "_id" : ObjectId("561637942d25a7644cae9940")
                }, 
                {
                    "name" : "2", 
                    "_id" : ObjectId("562f868ce73962c626a16b15")
                }
            ]
        }
    ], 
    "deals" : [
        {
            "name" : "3", 
            "_id" : ObjectId("562f86ebe73962c626a16b17")
        }
    ]
}
{ 
    "_id" : ObjectId("561637942d25a7644cae993e"), 
    "locations" : [
        {
            "deals" : [
                {
                    "name" : "4", 
                    "_id" : ObjectId("561637942d25a7644cae9940")
                }
            ]
        }
    ], 
    "deals" : []
}

就像这样:

代码语言:javascript
复制
{
    "deals": [{
        "name" : "1", 
        "_id" : ObjectId("561637942d25a7644cae9940")
    },{
        "name" : "2", 
        "_id" : ObjectId("562f868ce73962c626a16b15")
    },{
        "name" : "3", 
        "_id" : ObjectId("562f86ebe73962c626a16b17")
    },{
        "name" : "4", 
        "_id" : ObjectId("561637942d25a7644cae9949")
    }]
}

但我只是没能做到。看起来,如果我想将所有的交易组合在一个数组中,我就不应该使用展开,因为这会创建更多的文档,因为我只需要分组一次。这是我的尝试,根本行不通。

代码语言:javascript
复制
{
                "$project": {
                    "_id": 1,
                    "locations": 1,
                    "deals": 1
                }
            }, {
                "$unwind": "$locations"
            }, {
                "$unwind": "$locations.deals"
            }, {
                "$unwind": "$deals"
            }, {
                "$group": {
                    "_id": null,
                    "deals": { 
                        "$addToSet": "$locations.deals",
                        "$addToSet": "$deals"
                    }
                }
            }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-27 16:12:33

首先,应该使用筛选器来减少要在管道中使用$match操作符处理的文档的大小。然后,我们需要对“位置”数组进行$unwind,然后使用$project操作符重新构造文档。如果$cond字段为空数组,则使用[false]运算符返回单个元素数组,或者返回deals值,因为$unwind空数组将引发异常。当然,$setUnion运算符确实返回locations.deals数组或deals数组中出现的元素数组。然后,我们使用$setDifference操作符从合并数组中筛选出false元素。然后,我们需要另一个$unwind阶段来解构deals数组。在那里,我们可以轻松地$group您的文档。

代码语言:javascript
复制
db.collection.aggregate([
    { "$match": { "locations.0": { "$exists": true } } },
    { "$unwind": "$locations" }, 
    { "$project": { 
        "deals": { 
            "$setDifference": [
                { "$setUnion": [  
                     { "$cond": [
                         { "$eq" : [ { "$size": "$deals" }, 0 ] }, 
                         [false], 
                         "$deals"
                     ]},
                     "$locations.deals"
                ]}, 
                [false]
            ]
         }
    }},
    { "$unwind": "$deals" }, 
    { "$group": { 
        "_id": null, 
        "deals": { "$addToSet": "$deals" }
    }}
])

返回:

代码语言:javascript
复制
{
        "_id" : null,
        "deals" : [
                {
                        "name" : "1",
                        "_id" : ObjectId("561637942d25a7644cae9940")
                },
                {
                        "name" : "2",
                        "_id" : ObjectId("562f868ce73962c626a16b15")
                },
                {
                        "name" : "3",
                        "_id" : ObjectId("562f86ebe73962c626a16b17")
                },
                {
                        "name" : "4",
                        "_id" : ObjectId("561637942d25a7644cae9940")
                }
        ]
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33371128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档