首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有其他mongodb聚合表达式来实现此结果?

是否有其他mongodb聚合表达式来实现此结果?
EN

Stack Overflow用户
提问于 2019-03-22 04:52:40
回答 1查看 33关注 0票数 0

是否有其他聚合阶段或表达式来实现此结果?是否可以使用$map和$reduce数组表达式来迭代数组项并在$$ROOT中创建新的键/值对?

我很想知道是否有更好的方法来聚合这些数据。

聚合:

代码语言:javascript
复制
db.getCollection("test").aggregate([

    { $unwind: "$SubscriptionCharges"},
    { $addFields: { sc: { $objectToArray: "$SubscriptionCharges"} }},

    { $addFields: { cc: { $arrayElemAt: [ { $filter: { input: "$sc", as: "ch", cond:  { $eq: [ "$$ch.k", "ChargeName"]} }}, 0  ]},
                        q: { $arrayElemAt: [ { $filter: { input: "$sc", as: "ch", cond:  { $eq: [ "$$ch.k", "Quantity"]} }}, 0  ]},
                     }    },

    { $addFields: { "cc.k": "$cc.v", "cc.v": "$q.v" }},
    { $addFields: { charges:  {  $arrayToObject: [[ "$cc" ]] }  }},

    { $project: { SubscriptionCharges: 0, sc: 0, cc: 0, q: 0}},
    { $group: { _id: "$_id", CustomerNumber: { $first: "$CustomerNumber"}, CustomerType: { $first: "$CustomerType"}, CustomerName: { $first: "$CustomerName"}, charges: { $mergeObjects: "$charges"} }},
    { $replaceRoot: { newRoot: { $mergeObjects: [ "$$ROOT", "$charges"  ]}}},
    { $project: { charges: 0}}

])

实际:

代码语言:javascript
复制
 { 
        "_id" : BinData(3, "vRoG6+EVGEOOu6WYALc3VA=="), 
        "CustomerNumber" : "ABC", 
        "CustomerType" : "Direct", 
        "CustomerName" : "Test", 
        "SubscriptionCharges" : [
            {
                "ChargeCode" : "Code-1",
                "Price": 12,
                "ChargeName" : "Name-1", 
                "Quantity" : NumberLong(25), 
            }, 
            {
                "ChargeCode" : "Code-2",
                "Price": 15,
                "ChargeName" : "Name-2", 
                "Quantity" : NumberLong(1), 
            }, 
        ], 
    }

期望值:

代码语言:javascript
复制
{ 
    "_id" : BinData(3, "vRoG6+EVGEOOu6WYALc3VA=="), 
    "CustomerNumber" : "ABC", 
    "CustomerType" : "Direct", 
    "CustomerName" : "Test", 
    "Name-1": NumberLong(25),
    "Name-2":NumberLong(1)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-22 05:58:57

您可以避免使用$map执行$unwind,而是直接对地图的对象结果执行$replaceRoot

代码语言:javascript
复制
db.test.aggregate([{
    $replaceRoot: {
        newRoot: {
            $mergeObjects: ["$$ROOT", {
                $arrayToObject: {
                    $map: {
                        input: "$SubscriptionCharges",
                        as: "el",
                        in: {
                            k: "$$el.ChargeName",
                            v: "$$el.Quantity"
                        }
                    }
                }
            }]
        }
    }
}, {
    $project: {
        SubscriptionCharges: 0
    }
}])

它看起来简单得多:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55289059

复制
相关文章

相似问题

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