【问题标题】:Aggregation involving sum of array field(s) and normal field(s) in mongodbmongodb中涉及数组字段和普通字段之和的聚合
【发布时间】:2013-03-29 17:13:59
【问题描述】:

这是样本集:

{'f1': 10, '_id': 1, 'key': 'g', 'items': [{'i1': 10}, {'i1': 10}, {'i1': 10}]}
{'f1': 10, '_id': 2, 'key': 'g', 'items': [{'i1': 10}, {'i1': 10}, {'i1': 10}]}
{'f1': 77, '_id': 3, 'key': 'g', 'items': [{'i1': 10}, {'i1': 10}, {'i1': 10}]}

我想要一个公式,如:$sum(f1 + Σ[items.i1]) 在上述集合上计算。以下是我能想到的(在 pymongo 中):

db.collec.aggregate([    
        { "$unwind" : "$items"},
    { "$group" : {    
             "_id" : {"key": "$key", "id": "$_id"},    
     "matches" : { "$sum" : "$items.i1" },    
     "extra" : { "$sum" : "$f1" },    
     "count" : {"$sum": 1}    
                    }},
    { "$group": {    
             "_id" : "$_id.key",     
             "finalSum":{ "$sum":    
                        { "$add": ["$matches", {"$divide":["$extra", "$count"]}]}}}}      
    ]);

输出:

{'finalSum': 187.0, '_id': 'g'}

虽然这给出了正确的输出,但我希望有一个更好、更简单的解决方案: 任何帮助都非常感谢。

【问题讨论】:

    标签: mongodb pymongo aggregation-framework


    【解决方案1】:

    在对文档进行分组时,可以将“f1”保存到_id字段中,这样就不用为每个文档汇总和划分了。

    聚合操作是这样的:

    db.collec.aggregate([    
        { "$unwind" : "$items"},
        { "$group" : {    
              _id : {key: "$key", id: "$_id", f1 : "$f1" },    
              matches : { "$sum" : "$items.i1" },    
        }},
        { "$group": {    
              _id : "$_id.key",     
              finalSum : { "$sum":    
                            { "$add": ["$matches", "$_id.f1"]}}}}      
        ]);
    

    【讨论】:

    • 谢谢琳达。这似乎是一个更好的解决方案。但是我想知道 16mb 文档的限制可能不允许这种情况下大量记录和足够独特的 key - f1 组合。另外,有什么标准的方法吗?除了写多个$group ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多