繁体   English   中英

mongodb计数等于对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM