2014-02-25 48 views

回答

1

如果您確實只需要一個查詢,您可以撥打db.eval()(確保符合性能要求)。在EVAL,運行db.find()切實找到的所有記錄(我已經添加了一個$exist測試,以防萬一那你檢查每條記錄它在< 40 < 60範圍落在事情是這樣的:。

db.eval(function() { 
    var lt40 = 0, gt40lt60 = 0, gt60 = 0, r; 
    db.ARTDocument.find({'latestResult.boostedResult.relevancy': {$exists:1}}).forEach(function(doc) { 
     r = doc.latestResult.boostedResult.relevancy; 
     if (r < 40) { 
      lt40 ++; 
     } else { 
      r < 60 ? gt40lt60++ : gt60++ 
     }  
    }); 
    return { 
     lt40: lt40, 
     gt40lt60: gt40lt60, 
     gt60: gt60 
    }  
}); 

最後,返回一個記錄以三項罪名。

+0

謝謝丹。查詢按預期工作,但有沒有其他方法使用聚合函數並且不影響性能 – anilthapliyal

1

可能的MapReduce是不是? 我懷疑這會比db.eval更好,因爲它會利用碎片正常。

mapper=function(){ 
    if (this.latestResult.boostedResult.relevancy >40){ 
     emit('lt40', {'count':1}); 
    } 
    if (this.latestResult.boostedResult.relevancy > 40 && this.latestResult.boostedResult.relevancy<60){ 
     emit('middle', {'count':1}); 
    } 
    if (this.latestResult.boostedResult.relevancy >60){ 
     emit('gt60', {'count':1}); 
    } 
} 


reducer=function(k,v){ 
    counter=0; 
    for (i=0;i<v.length;i++){ 
     counter+=v[i].count; 
    } 
    return {'count':counter} 
} 
db.ArtCategories.mapReduce(mapper, reducer, {out:{inline:1}}) 

這應該給你分類的結果

+0

此解決方案可能比我的更好。讓基準決定! –

0

我們可以考慮這個,而不是mapReduce?

db.ARTDocument.aggregate([ 
{"$group": { 
    "_id": {"$cond": [ 
     {"$lte": ["$latestResult.boostedResult.relevancy", 40] }, 
     "Lowest",         
     {"$cond": [ 
      {"$and": [ 
       {"$gt": ["$latestResult.boostedResult.relevancy", 40] }, 
       {"$lte": ["$latestResult.boostedResult.relevancy", 60] } 
      ]}, 
      "Medium", 
     {"$cond": [ 
      {"$and": [ 
       {"$gt": ["$latestResult.boostedResult.relevancy", 60] }, 
       {"$lte": ["$latestResult.boostedResult.relevancy", 80 ] } 
      ]}, 
      "Higher", 
       "Highest" 
     ]} 
    ]} 
]}, 
"count": {"$sum": 1} 
    }}, 
    {"$sort": { "count": 1 }} 
]) 
相關問題