子文档 MongoDB 中键的不同值(1 亿条记录)

Posted

技术标签:

【中文标题】子文档 MongoDB 中键的不同值(1 亿条记录)【英文标题】:Distinct values of a key in a sub-document MongoDB (100 million records) 【发布时间】:2013-04-08 11:34:21 【问题描述】:

我的“样本”集合中有 1 亿条记录。我想要另一个包含所有不同用户名“user.screen_name”的集合

我的 mongodb 数据库“样本”集合中有以下结构:


"_id" : ObjectId("515af34297c2f607b822a54b"),
"text" : "random text goes here",
"user" :
  
    "id" : 972863366,
    "screen_name" : "xname",
    "verified" : false,
    "time_zone" : "Amsterdam",
   

当我尝试“distinct('user.id).length”之类的操作时,我收到以下错误:

    "errmsg" : "exception: distinct too big, 16mb cap",

我需要一种有效的方法来创建另一个集合,其中只有 "user_name": "name" 的不同用户在我的“示例”集合中。所以我可以查询这个新数据库的大小并获取不同用户的数量。 (以及未来的进一步分析)

【问题讨论】:

你用 mapreduce 标记了这个,你尝试使用 MongoDB 的 mapreduce 吗? 不是真的,我知道答案可能是使用 mapreduce,但是,我对语法和概念并不是很熟悉。 从文档开始。这是一个很好的起点。 docs.mongodb.org/manual/core/map-reduce 【参考方案1】:

我尝试了我找到的解决方案 here,它运行良好 :) .. 我会保留线程并添加我的代码以防有人需要它。

var SOURCE = db.sample;
var DEST = db.distinct;
DEST.drop();
map = function() 
  emit( this.user.screen_name , count: 1);


reduce = function(key, values) 
  var count = 0;

  values.forEach(function(v) 
    count += v['count'];   
  );

  return count: count;
;

res = SOURCE.mapReduce( map, reduce, 
     out: 'distinct', 
     verbose: true
    
    );

print( "distinct count= " + res.counts.output );
print( "distinct count=", DEST.count() );

问候

【讨论】:

以上是关于子文档 MongoDB 中键的不同值(1 亿条记录)的主要内容,如果未能解决你的问题,请参考以下文章

反射应用二(获取xml中键的属性及其值)

更新 Firebase 中键的值

mongodb count 每个字段/键的不同值的数量

如何检索json中键的特定值?

如何加快一系列文档中键的存在总和? - 熊猫,nltk

修改 boost unordered_map 中键的值