2015-10-06 120 views
0

我已经成功执行了一个查询,该查询给出了我的模式中某个特定字段的平均值。我想在下一个查询中使用之前查询中得到的平均值进行比较。当我尝试这样做时,命令提示符将其视为两个不同的查询而不是一个查询。在下一个查询中使用一个查询的结果

我该如何在MongoDB中做到这一点?

+1

你能告诉我们你目前的疑问吗? –

+1

第一个查询: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

+0

第二个查询:db.business.find({stars:{$ gt:Result.average}}) – Blank

回答

0

我怀疑你是真的在你正在使用的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(),因为它更适合于任务,而且速度更快。

相关问题