json - 如何获取集合中的文档列表,直到“成本”字段的总和达到特定值(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 个文件?cost
asc
这里:成本为 23(面条)+33(汉堡)<=60,因此获取了这两个文档。
输出应该是:
[
{
_id:4,
dish:noodles,
cost:23
},
{
_id:2,
dish:burger,
cost:33,
}
]
解决方案
你可以试试这个 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 以获取结果。希望能帮助到你。
推荐阅读
- azure-data-factory-2 - Blob 到 azure sql db 加载
- java - 在jackson中将一个字段从字符串更改为json对象
- javascript - 如何通过 create-react-app 项目在 SASS、SCSS 和 LESS 之间选择使用哪一个
- angular - 如何获取当前模块的所有路由?
- flutter - 如何在 Flutter 中的 HTTP 发布请求中传递标头?
- java - 蓝牙发现问题
- azure - Power BI 架构
- linux-kernel - 如何判断 System.map 中的符号是变量还是函数?
- javascript - 为什么我的按钮不会前进到下一个问题?
- sql - 如果联接表中不存在数据,则从 Max(Date) 中获取 NULL 值