Javascript 如何在不同条件下对同一查询执行db.collection.count()?
我是否可以使用单个查询而不是多个计数查询来获取以下三个范围的计数Javascript 如何在不同条件下对同一查询执行db.collection.count()?,javascript,mongodb,aggregation-framework,Javascript,Mongodb,Aggregation Framework,我是否可以使用单个查询而不是多个计数查询来获取以下三个范围的计数 db.ARTDocument.count({'latestResult.boostedResult.relevancy': {$lt:40}}) db.ARTDocument.count({'latestResult.boostedResult.relevancy': {$gt:40,$lt:60}}) db.ARTDocument.count({'latestResult.boostedResult.relevancy': {$
db.ARTDocument.count({'latestResult.boostedResult.relevancy': {$lt:40}})
db.ARTDocument.count({'latestResult.boostedResult.relevancy': {$gt:40,$lt:60}})
db.ARTDocument.count({'latestResult.boostedResult.relevancy': {$gt:60}})
如果确实只需要一个查询,可以调用(确保满足性能要求)。在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
}
});
db.eval(函数(){
var lt40=0,gt40lt60=0,gt60=0,r;
find({'latestResult.boostedResult.relevance':{$exists:1}}).forEach(函数(doc){
r=doc.latestResult.boostedResult.relevance;
if(r<40){
lt40++;
}否则{
r<60?gt40lt60++:gt60++
}
});
返回{
lt40:lt40,
gt40lt60:gt40lt60,
gt60:gt60
}
});
最后,返回一个包含三个计数的记录。是否可以使用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}})
mapper=function(){
if(this.latestResult.boostedResult.relevance>40){
emit('lt40',{'count':1});
}
if(this.latestResult.boostedResult.relevance>40和this.latestResult.boostedResult.relevancy60){
emit('gt60',{'count':1});
}
}
减速器=功能(k,v){
计数器=0;
对于(i=0;i),我们可以考虑这一点而不是MapReduce?< /P>
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 }}
])
谢谢Dan。查询工作正常,但是否有其他方法使用聚合函数且不影响性能?此解决方案可能比我的更好。让基准测试来决定!