首页 > 解决方案 > 如何获取集合中的文档列表,直到“成本”字段的总和达到特定值(mongoDb)?

问题描述

我有一个收藏:

[
 {
  _id:1,
  dish:pizza,
  cost:52
 },
 {
  _id:2,
  dish:burger,
  cost:33,
 },
 {
  _id:3,
  dish:sandwich,
  cost:64,
 }
 {
  _id:4,
  dish:noodles,
  cost:23
 },
]

我的预算设置等于某个值,例如 60。

是否可以按顺序sort洗碗并获得成本总和小于或等于 60 的前 n 个文件?costasc

这里:成本为 23(面条)+33(汉堡)<=60,因此获取了这两个文档。

输出应该是:

[
 {
  _id:4,
  dish:noodles,
  cost:23
 }, 
 {
  _id:2,
  dish:burger,
  cost:33,
 }
]

标签: jsonnode.jsmongodb

解决方案


你可以试试这个 map-reduce 命令:

// Variable for map
var _map = function () {   
    emit(null,this);
};

// Variable for reduce
var _reduce = function (key, values) {
     var sum = 0;
     var resultArray=[]
for(value in values){
  sum=sum+values[value].cost;
  if(sum<=60){
    resultArray.push(values[value]);
  }
}
var result = {};
result.selected=resultArray;
return result;
}
;

db.runCommand({ 
    mapReduce: "01",
    map: _map,
    reduce: _reduce,
    out: { "inline" : 1},
    query: {},
    sort: {cost:1},
    inputDB: "testing",
 });
})

注意按命令中指示的成本排序。您可以使用查询对象在 map-reduce 之前过滤您的文档。它会输出

{ 
    "_id" : null, 
    "value" : {
        "selected" : [
            {
                "_id" : 4, 
                "dish" : "noodles", 
                "cost" : 23
            }, 
            {
                "_id" : 2, 
                "dish" : "burger", 
                "cost" : 33
            }
        ]
    }
}

此时很容易访问 value.selected 以获取结果。希望能帮助到你。


推荐阅读