代码之家  ›  专栏  ›  技术社区  ›  Helping hand

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

  •  1
  • Helping hand  · 技术社区  · 6 年前

    我有一个收藏:

    [
     {
      _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 盘子旁边 cost 在里面 asc 订购并获得成本总和小于或等于60的前n份文件?

    这里:23(面条)+33(汉堡)<=60的费用,所以这两份文件被取走了。

    输出应为:

    [
     {
      _id:4,
      dish:noodles,
      cost:23
     }, 
     {
      _id:2,
      dish:burger,
      cost:33,
     }
    ]
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   matthPen    6 年前

    您可以尝试使用此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很容易得到结果。 希望有帮助。