Tôi đã xem qua một số bài báo và ví dụ nhưng vẫn chưa tìm ra cách hiệu quả để thực hiện truy vấn SQL này trong MongoDB (nơi có hàng triệu hàng các tài liệu)
Nỗ lực đầu tiên
(ví dụ: từ câu hỏi gần như trùng lặp này - Mongo tương đương với SELECT DISTINCT của SQL? )
db.myCollection.distinct("myIndexedNonUniqueField").length
Rõ ràng là tôi gặp lỗi này vì tập dữ liệu của tôi rất lớn
Thu Aug 02 12:55:24 uncaught exception: distinct failed: {
"errmsg" : "exception: distinct too big, 16mb cap",
"code" : 10044,
"ok" : 0
}
Nỗ lực thứ hai
Tôi quyết định thử làm một nhóm
db.myCollection.group({key: {myIndexedNonUniqueField: 1},
initial: {count: 0},
reduce: function (obj, prev) { prev.count++;} } );
Nhưng thay vào đó, tôi nhận được thông báo lỗi này:
exception: group() can't handle more than 20000 unique keys
Nỗ lực thứ ba
Tôi chưa thử nhưng có một số đề xuất liên quan đến mapReduce
ví dụ
- cái này làm thế nào để phân biệt và nhóm trong mongodb? (không được chấp nhận, tác giả câu trả lời / OP đã không kiểm tra nó)
- này một nhóm MongoDB bởi Các chức năng (có vẻ tương tự như Second Attempt)
- cái này http://blog.emmettshear.com/post/2010/02/12/Counting-Uniques-With-MongoDB
- cái này https://groups.google.com/forum/?fromgroups#!topic/mongodb-user/trDn3jJjqtE
- cái này http://cookbook.mongodb.org/patterns/unique_items_map_reduce/
Cũng thế
Có vẻ như có một yêu cầu kéo trên GitHub sửa .distinct
phương thức đề cập rằng nó chỉ trả về một số lượng, nhưng nó vẫn đang mở: https://github.com/mongodb/mongo/pull/34
Nhưng tại thời điểm này, tôi nghĩ rằng điều đáng hỏi ở đây là gì mới nhất về chủ đề này? Tôi có nên chuyển sang SQL hoặc một DB NoSQL khác để có số lượng riêng biệt không? hoặc là có một cách hiệu quả?
Cập nhật:
Nhận xét này trên tài liệu chính thức của MongoDB không được khuyến khích, điều này có chính xác không?
http://www.mongodb.org/display/DOCS/Aggregation#comment-430445808
Cập nhật2:
Có vẻ như Khung tổng hợp mới trả lời nhận xét trên ... (MongoDB 2.1 / 2.2 trở lên, có sẵn bản xem trước phát triển, không dành cho sản xuất)