我已经成功执行了一个查询,该查询给出了我的模式中某个特定字段的平均值。我想在下一个查询中使用之前查询中得到的平均值进行比较。当我尝试这样做时,命令提示符将其视为两个不同的查询而不是一个查询。在下一个查询中使用一个查询的结果
我该如何在MongoDB中做到这一点?
我已经成功执行了一个查询,该查询给出了我的模式中某个特定字段的平均值。我想在下一个查询中使用之前查询中得到的平均值进行比较。当我尝试这样做时,命令提示符将其视为两个不同的查询而不是一个查询。在下一个查询中使用一个查询的结果
我该如何在MongoDB中做到这一点?
我怀疑你是真的在你正在使用的API的上下文中而不是在shell中处理,但原理保持不变。
您的第一个结果始终是由“.group()
”方法返回的“数组”,因此要将其作为奇异值访问,您只需返回“第一个”数组元素即0
索引。
此外,您的操作和整个案例仅仅是查找字段的“平均值”,然后查找那些大于返回平均值的项目。 .aggregate()
方法的语法更简单,运行速度也更快,因为它的操作都是本地编码的,而不是JavaScript解释,在后一种情况下,这会显着减慢速度。
使用本机操作,除非没有其他选择:
var result = db.business.aggregate([
{ "$group": {
"_id": null,
"average": { "$avg": "$stars" }
}}
]).toArray()[0];
db.business.find({ "stars": { "$gt": result.average } })
第一操作减少到一个单一对象的数组,从中你从数组采取只是第一项。然后可以在第二个查询中引用该对象,并返回结果。
在异步环境中,只需要在第一个操作的回调结果中调用第二个查询,以便在操作完成后查看范围结果。但使用.aggregate()
,因为它更适合于任务,而且速度更快。
你能告诉我们你目前的疑问吗? –
第一个查询:var reduceFunction = function(currentValue,previousValue){ previousValue.total + = currentValue.stars; \t previousValue.count + = 1; }; var finalizeFunction = function(currentValue){ currentValue.average = currentValue.total/currentValue.count; }; 结果= db.business.group({ “_id”:{ “分”:真}, 初始:{总数:0,计数:0}, 减少:reduceFunction, 最终化:finalizeFunction }); – Blank
第二个查询:db.business.find({stars:{$ gt:Result.average}}) – Blank