根据子文档聚合设置字段

时间:2018-04-06 20:45:28

标签: mongodb

在下面的集合中,我想通过汇总total子文档来计算sold_total / sold_percent / copies

同样,我想通过汇总grand_total子文档来计算sold_grand_total / sold_grand_percent / inventory。 我喜欢在写入/更新期间或在使用MongoDB函数/作业期间执行此操作,而不是在“读取”期间执行此操作。为了提高效率。

我尝试了几个聚合管道,但子阵列展开副本数组会清除它上面的所有内容。任何帮助表示感谢,谢谢。

{
    "_id" : "xyz",
    "store" : "StoreB",
    "grand_total" : 7,
    "sold_grand_total" : 5,
    "sold_grand_percent" : 72,
    "inventory" : [
        {"title" : "BookA", "total" : 4, "sold_total" : 3, "sold_percent" : 75,
            "copies" : [
                    {"_id": 1, "condition": "new", "sold": 1 },
                    {"_id": 2,"condition": "new", "sold": 1 },
                    {"_id": 3,"condition": "new", "sold": 0 },
                    {"_id": 4,"condition": "new", "sold": 1 }
            ] 
        },
        {"title" : "BookB", "total" : 1, "sold_total" : 1, "sold_percent" : 100,
            "copies" : [
                    {"_id": 1, "condition": "new", "sold": 1 }
            ] 
        },
        {"title" : "BookC", "total" : 2, "sold_total" : 1, "sold_percent" : 50,
            "copies" : [
                    {"_id": 1, "condition": "new", "sold": 1 },
                    {"_id": 2,"condition": "new", "sold": 0 }
            ] 
        }
    ]
}

1 个答案:

答案 0 :(得分:0)

有多种方法可以实现这一目标。我不确定你的架构是什么。

这是两种不同的聚合: 这个提供“total”和“sold_total”

[
    {
        "$unwind" : "$inventory"
    },
    {
        "$unwind" : "$inventory.copies"
    },
    {
        "$group": { 
            "_id": "$inventory.title", 
            "total": { 
                "$sum": "$inventory.copies.sold" 
            },
           "sold_total": { 
                "$sum": 1 
            }  
        } 
    }]

其他提供 grand_total / sold_grand_total

[
    {
        "$unwind" : "$inventory"
    },
    {
        "$unwind" : "$inventory.copies"
    },
    {
    "$group": { 
        "_id": null, 
        "total": { 
            "$sum": "$inventory.copies.sold" 
        },
       "count": { 
            "$sum": 1 
        }  
    } 
}]

您可以通过操作从组中获取整个对象并在其上执行其他组来同时执行这两项操作。基本上,项目和管道。