Mongodb 是否自动递增/求和查询结果的一个字段?
我举一个例子来解释: 我收集了100万件ID为123的物品,每件物品的价值不同:“价值” 有钱的用户x可以“购买”物品。我基本上想知道用户可以以最优雅的方式购买多少物品 所以我得到了Mongodb 是否自动递增/求和查询结果的一个字段?,mongodb,Mongodb,我举一个例子来解释: 我收集了100万件ID为123的物品,每件物品的价值不同:“价值” 有钱的用户x可以“购买”物品。我基本上想知道用户可以以最优雅的方式购买多少物品 所以我得到了 db.items.find({Item_ID:123},{Item_Age:1,Item_worth:1}.sort({Item_age:1}) ->提供按年龄排序的项目ID为123的所有项目 我现在可以 迭代所有项目,直到项目价值的总和==用户的钱,但不知何故,我认为如果返回的列表与100万个项目匹配,并且用
db.items.find({Item_ID:123},{Item_Age:1,Item_worth:1}.sort({Item_age:1})
->提供按年龄排序的项目ID为123的所有项目
我现在可以
- 迭代所有项目,直到项目价值的总和==用户的钱,但不知何故,我认为如果返回的列表与100万个项目匹配,并且用户可能只有1000个项目的钱,那么这并不是真正有效的
- 执行循环并查询1000次
- 将查询限制为100项。但这是非常不稳定的,仍然可能导致许多循环
谢谢对于这一点,使用迭代可以获得项目的运行总数,然后过滤结果 因此,请按如下方式定义映射器:
var映射器=函数(){
总价值=总价值+此项价值;
var canBuy=userMoney>=totalWorth;
如果(可以购买){
散发(
{
Item\u ID:this.Item\u ID,
Item_Age:此。Item_Age
},
{
价值:这个。物品价值,
totalWorth:totalWorth,
canBuy:canBuy
}
);
}
}
这会将totalWorth
的变量与项目的当前“价值”累加起来。然后检查当前的totalWorth
值是否超过输入的userMoney
金额。如果没有,则不发射。这是自动过滤
所有发出的关键点都是唯一的,因此只需按如下方式运行mapReduce:
db.items.mapReduce(
制图员,
函数(){},//虽然未调用,但需要reduce参数
{
查询:{Item_ID:123}
排序:{Item_ID:1,Item_Age:1},
输出:{inline:1},
范围:{
总价值:0,
用户货币:30
},
}
)
因此,看看其中的其他部分:
- 查询:是用于获取选择的标准查询对象
- 排序:实际上不是必需的,因为您正在按升序查看
项目。但是,如果您首先需要最旧的
,则可以反向排序项目_Age
- out:提供一个内联对象作为结果,可用于获取匹配项
- 范围:定义可由函数访问的全局变量。因此,我们为
提供一个初始值,并将totalWorth
的参数值传递为用户必须购买的金额userMoney
在一天结束时,结果包含用户可以购买的金额范围内的物品的过滤列表。所以您想要的是按物品年龄排序的前X个物品,其中物品的总价值小于或等于用户的钱?哇,回答得很好。我看了一下地图,但没能想清楚这太完美了,谢谢!您会看到输出有点“时髦”,但mapReduce就是这样做的。不过,它跳过了一些步骤,处理过程只是代码。很高兴这有帮助。