【发布时间】:2012-07-31 17:24:54
【问题描述】:
我浏览了几篇文章和示例,但尚未找到在 MongoDB 中执行此 SQL 查询的有效方法(其中有数百万 rows 文档)
第一次尝试
(例如,来自这个几乎重复的问题 - Mongo equivalent of SQL's SELECT DISTINCT?)
db.myCollection.distinct("myIndexedNonUniqueField").length
显然我收到了这个错误,因为我的数据集很大
Thu Aug 02 12:55:24 uncaught exception: distinct failed: {
"errmsg" : "exception: distinct too big, 16mb cap",
"code" : 10044,
"ok" : 0
}
第二次尝试
我决定尝试做一个小组
db.myCollection.group({key: {myIndexedNonUniqueField: 1},
initial: {count: 0},
reduce: function (obj, prev) { prev.count++;} } );
但我收到了这个错误消息:
exception: group() can't handle more than 20000 unique keys
第三次尝试
我还没试过但是有几个建议涉及mapReduce
例如
- 这个how to do distinct and group in mongodb?(不接受,回答作者/OP没有测试)
- 这个MongoDB group by Functionalities(好像和Second Attempt类似)
- 这个http://blog.emmettshear.com/post/2010/02/12/Counting-Uniques-With-MongoDB
- 这个https://groups.google.com/forum/?fromgroups#!topic/mongodb-user/trDn3jJjqtE
- 这个http://cookbook.mongodb.org/patterns/unique_items_map_reduce/
还有
似乎 GitHub 上有一个拉取请求修复了 .distinct 方法,提到它应该只返回一个计数,但它仍然是开放的:https://github.com/mongodb/mongo/pull/34
但在这一点上,我认为值得在这里问一下,关于这个主题的最新消息是什么?我应该转移到 SQL 还是其他 NoSQL DB 来进行不同的计数?还是有什么有效的方法?
更新:
对 MongoDB 官方文档的评论并不令人鼓舞,这是准确的吗?
http://www.mongodb.org/display/DOCS/Aggregation#comment-430445808
更新2:
似乎新的聚合框架回答了上述评论...(MongoDB 2.1/2.2 及更高版本,提供开发预览版,不适用于生产)
【问题讨论】:
-
我认为您需要经常这样做,否则性能不会那么重要。在这种情况下,我会将不同的值存储在一个单独的集合中,当您插入新文档时会更新该集合,而不是尝试对这么大的集合执行不同的操作。要么这样,要么我会重新评估我对 MongoDb 的使用,并可能转向其他东西。如您所见,MongoDb 目前并不擅长您正在尝试做的事情。
-
@TimGautier 谢谢,我很害怕,插入所有这些值需要几个小时,我之前应该想到的 :) 我想我现在会花时间将它插入 MySQL对于这些统计数据...
-
你也可以做一个增量MR,基本上模拟聚合数据的增量索引。我的意思是这取决于你什么时候需要你使用的结果。我可以想象 MySQL 会得到很多 IO 并且不会这样做(我可以杀死一个小型服务器,在索引上仅区分 100k 内联文档),但我认为它在查询这类东西时更灵活.
-
我不同意 mongo 不擅长这种事情。这种东西是 Mongo 擅长的。
-
不幸的是,版主删除了我在重复问题上也发布的答案。我不能在那里删除它并在此处重新发布,因此链接:stackoverflow.com/a/33418582/226895
标签: mongodb