我用一个例子来解释:
我有一个100万件物品的集合,ID为:123,每个物品都有不同的价值:“值得”
使用MONEY的用户x可以“购买”这些物品。我基本上想知道用户可以用最优雅的方式购买多少件物品。
所以我得到了。
db.items.find({Item_ID:123},{Item_Age:1,Item_worth:1}.sort({Item_age:1})
- >给我所有Item_ID项目:123按年龄排序。
我现在可以
或
或
SO是否有一个查询方法,它返回每个文档中所有值的总和? 或者任何其他有效的建议可能会有所帮助。
由于
答案 0 :(得分:0)
使用mapReduce进行迭代会更好地获取项目的运行总计,然后过滤结果。
所以定义一个mapper如下:
var mapper = function () {
totalWorth = totalWorth + this.Item_Worth;
var canBuy = userMoney >= totalWorth;
if ( canBuy ) {
emit(
{
Item_ID: this.Item_ID,
Item_Age: this.Item_Age
},
{
worth: this.Item_Worth,
totalWorth: totalWorth,
canBuy: canBuy
}
);
}
}
这会累积totalWorth
的变量,其中包含项目的当前“值”。然后检查当前totalWorth
值是否超过输入的userMoney
量。如果没有,那么你就不会发射。这是自动过滤。
所有发出的键都是唯一的,所以只需运行mapReduce,如下所示:
db.items.mapReduce(
mapper,
function(){}, // reduce argument is required though not called
{
query: { Item_ID: 123 }
sort: { Item_ID: 1, Item_Age: 1 },
out: { inline: 1 },
scope: {
totalWorth: 0,
userMoney: 30
},
}
)
所以看看其他部分:
查询:您是用于获取选择的标准查询对象
排序:确实不需要,因为您按升序查看Item_Age
。但如果您想先使用最早的Item_Age
,那么您可以撤销排序。
out:为您提供内联对象,以便您可以使用它来获取匹配的项目。
范围:定义函数可以访问的全局变量。因此,我们为totalWorth
提供初始值,并将userMoney
的参数值作为用户必须购买的金额传递。
在一天结束时,结果中包含已过滤的项目清单,这些项目的金额低于用户可以购买的金额。