Mongodb MongDb对字典元素求和

Mongodb MongDb对字典元素求和,mongodb,Mongodb,嗨,我有一个文件,它有以下结构,我想把所有城市的所有不同水果的美元加起来,所以输出值应该是{水果:{苹果:$9,葡萄:$15,梨:$14,橙子:$20}} 水果市场 { _身份证号码:1 市场名称:洛杉矶, 水果:{苹果:$2,葡萄:$3,梨:$4,橙子:$5} _身份证号码:1 品名:CHI, 水果:{苹果:$3,葡萄:$5,梨:$4,橙子:$7} _身份证号码:1 市场名称:纽约, 水果:{苹果:$4,葡萄:$7,梨:$6,橙子:$8} }更新答案 首先,为了确保我可以测试这一点,我创建了一

嗨,我有一个文件,它有以下结构,我想把所有城市的所有不同水果的美元加起来,所以输出值应该是{水果:{苹果:$9,葡萄:$15,梨:$14,橙子:$20}}

水果市场

{ _身份证号码:1 市场名称:洛杉矶, 水果:{苹果:$2,葡萄:$3,梨:$4,橙子:$5}

_身份证号码:1 品名:CHI, 水果:{苹果:$3,葡萄:$5,梨:$4,橙子:$7}

_身份证号码:1 市场名称:纽约, 水果:{苹果:$4,葡萄:$7,梨:$6,橙子:$8}


}

更新答案

首先,为了确保我可以测试这一点,我创建了一个包含水果信息的集合,并插入了您的示例数据:

db.fruitmarket.insert(
   [
       { marketname : "LA", fruit : { apples : 2, grapes : 3 , pears : 4, oranges : 5} },
       { marketname : "CHI", fruit : { apples : 3, grapes : 5 , pears : 4, oranges : 7} },
       { marketname : "NY", fruit : { apples : 4, grapes : 7 , pears : 6, oranges : 8} }
   ]
)
映射函数为每个文档发出
水果
键的所有属性:

function() {
    for (var key in this.fruit) {
        emit(key, this.fruit[key]);
    }
}
reduce函数将所有
结果
值相加:

function(key, values) {
    return Array.sum(values);
}
最后,我运行了map reduce:

db.loadServerScripts();
db.fruitmarket.mapReduce(mapSubProperties, reduceSubProperties, { out: "fruits"})
我得到了你想要的结果:

/* 0 */
{
    "_id" : "apples",
    "value" : 9
}

/* 1 */
{
    "_id" : "grapes",
    "value" : 15
}

/* 2 */
{
    "_id" : "oranges",
    "value" : 20
}

/* 3 */
{
    "_id" : "pears",
    "value" : 14
}

如果我事先不知道键值,如何处理聚合。我可以写一些更通用的东西,其中所有的“水果”都是以前不知道的。我试着想办法做到这一点,但看起来只有当水果对象存储一个值数组时才可能做到。如果所有这些都在一个数组中,那么您可以使用Map Reduce或$unwind聚合来完成您正试图执行的操作。或者,你可以试着在水果的属性上使用for循环,但我不确定,所以我不确定我是否完全理解这个问题/答案中给出的解决方案,但我认为这离回答你的问题更近了。此外,您的解决方案实际上可能看起来更简单,因为在您的案例中,您不必担心递归-您已经知道所有的结果都在“水果”键中,对吗?@krish727-查看更新的答案。这个答案远远优于我最初的回答,因为它遍历了“水果”子文档中的所有内容,然后返回每种水果的总美元价值。