Mongodb 如何使用json API在mongo db 2.0.6中编写简单的聚合查询
刚启动mongo,并且已经开始出现查询问题。我有一个名为“externalTransaction”的集合,我想编写一个类似于此mysql查询的集合:Mongodb 如何使用json API在mongo db 2.0.6中编写简单的聚合查询,mongodb,aggregation-framework,Mongodb,Aggregation Framework,刚启动mongo,并且已经开始出现查询问题。我有一个名为“externalTransaction”的集合,我想编写一个类似于此mysql查询的集合: select transactionCode, sum(amount) as totalSum, count(amount) as totalCount from externalTransaction where transactioncode in ('aa','bb','cc') group by sum
select transactionCode,
sum(amount) as totalSum,
count(amount) as totalCount
from externalTransaction
where transactioncode in ('aa','bb','cc')
group by sum(amount)
以下是我的尝试:
{
"collectionName": "externalTransaction",
sort: {transactionCode:-1},
query: {this._id: {$in:['aa','bb','cc']}},
mapReduce:{
'map': 'function(){
emit(this.transactionCode, this.amount);
}',
'reduce': 'function(key, values){
var result = {count: 0, sum: 0.0};
values.forEach(function(value) {
result.count++
result.sum += value.amount;
});
return result;
}',
'out' : 'sumAmount'
}
}
上面的查询为我提供了一个如下所示的结果集:
_id value.count value.sum
ct 2.0 NaN
bb 40.0 NaN
fg 71.0 NaN
fd 36.0 NaN
sd 5.0 NaN
as 4.0 NaN
aa 71.0 NaN
df 4.0 NaN
cc 10.0 NaN
从版本为
2.0.6
的文档中,我还不能使用聚合框架
,因此如何在mongo中处理像我这样的简单查询。感谢阅读并原谅我的问题的琐碎。您的映射
和减少
函数中有一些错误。首先,在map
中,您发出一个简单的数字,在reduce中,您尝试获取一个数字的amount
。我敢打赌,它没有那种属性。其次,map
和reduce
的输出必须是一致的,因为reduce
应该可以在部分简化的结果上运行。尝试以下功能:
var map = function() {
emit(this.transactionCode, {sum: this.amount, count: 1})
}
var reduce = function(k, vals) {
var result = {sum: 0, count: 0};
vals.forEach(function(v) {
result.sum += v.sum;
result.count += v.count;
});
return result;
}
谢谢你的回答。我想根据你的建议,我有些东西能用。但是我想知道为什么过滤器不能用。它仍然在挑选每一笔交易。“我在那里也做错什么了吗?”布莱克老师:是的,看起来很奇怪。它不应该是
query:{transactionCode:{$in:['aa','bb','cc']}
?将其更改为query:{$in:['aa','bb','cc']}
但仍然拉取所有内容:(您到底是如何运行它的?从何处获得此语法的?请看下面的示例:。尝试使其在mongo shell中工作。