我已经浏览了几篇文章和示例,但尚未找到在 MongoDB 中执行此 SQL 查询的有效方法(其中有数百万行文件)
第一次尝试
(例如,来自这个几乎重复的问题 - Mongo 相当于 SQL 的 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
例如
- 这个如何在 mongodb 中进行区分和分组?(不接受,回答作者/OP未测试)
- 这个按功能划分的 MongoDB 组(似乎类似于第二次尝试)
- 这个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 及更高版本,提供开发预览,不适用于生产)