2015-10-06 162 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(),因爲它更適合於任務,而且速度更快。

相關問題