[英]mongodb count equal object
我有一个MongoDB数据库,其中的文档包含一个过滤器字段。 这些文档如下所示:
{
"_id": ObjectId("503208f5b5db0135387d9249"),
"name": "name1",
"filter": "facebook"
} {
"_id": ObjectId("503208f5b5db0135387d9249"),
"name": "name2",
"filter": "twitter"
}
{
"_id": ObjectId("503208f5b5db0135387d9249"),
"name": "name3",
"filter": "twitter"
}
我想按类型计数。 这个例子应该是这样的:
facebook => 1, twitter => 2
使用红宝石代码,计数非常慢。
过滤器是一个字符串,可以是任何东西。 例如:
{facebook : 1203, twitter : 201, wherever : 200, othertype : 400}
我正在使用mongo mapper(红宝石驱动程序)。
=============编辑3
终于可以了。 这是Ruby驱动程序的代码:
def map
'function(){
emit(this.plataforma, 1);
}'
end
def reduce
'
function(prev, current) {
var n = 0;
current.forEach(function(v){
n+=v;
});
return n;
}'
end
def build
Mention.collection.map_reduce(map, reduce, :query => {})
end
我问了一个问题,但没有任何答案。 因此,如果只有两种可能的过滤条件:facebook和twitter,则可以通过两个查询来做到这一点:
db.yourcollection.count({
'filter' : 'facebook'
})
这将返回您1
db.yourcollection.count({
'filter' : 'twitter'
})
这会给你2
这类似于: http : //cookbook.mongodb.org/patterns/count_tags/
它在哪里显示如何运行MR,如下所示:
var map = function(){
emit(this.filter,1);
}
var reduce = function(previous,current){
var count = 0;
for (index in current) {
count += current[index];
}
return count;
}
然后它将输出到以下格式的另一个集合(如果需要,可以内联):
{
_id: facebook,
value: 1,
_id: twitter,
value: 2
}
这是用MongoDB的JS控制台语言编写的。 MongoDB有一个内置的JavaScript解析器(spidermonkey),可以解析MR函数。 在Ruby中,您将像这样封装函数:
map = BSON::Code.new "function() { emit(this.filter, 1); }"
然后像这样运行MR:
col.map_reduce(map, reduce,
{
:out => 'summary_collection',
:raw => true
}
)
然后,您可以通过提供字符串表示形式_id
查询该过滤器的摘要集合,或者执行简单的find()
获得所有结果。
如果您说过滤器可以是任何东西-那么您应该使用mapreduce。 http://www.mongodb.org/display/DOCS/MapReduce
这是一个有效的代码,将其放在mongo控制台中,然后将其转换为ruby。
首先创建地图功能:
var map = function(){
emit(this.filter, 1);
}
减少功能:
var reduce = function(key, value){
var n = 0;
value.forEach(function(v){
n+=v;
});
return n;
};
因为您使用的是旧版本的mongo,所以必须执行以下操作:
res = db.runCommand({
'mapreduce' : 'YOURCOLLECTION',
'map' : map,
'reduce' : reduce,
'out' : 'tmp'
});
db.tmp.find();
这将返回你
{'_id' : 'facebook', 'value' : 1},
{'_id' : 'twitter', 'value' : 2}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.