Я пройшов кілька статей та прикладів, і досі не знайшов ефективного способу зробити цей запит SQL у MongoDB (де мільйони рядки документи)
Перша спроба
(наприклад, із цього майже дубльованого запитання - монгоський еквівалент вибору SELECT DISTINCT в SQL? )
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? (не прийнято, автор відповіді / ОП не тестував)
- ця одна група 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 для чіткого підрахунку? чи існує ефективний спосіб?
Оновлення:
Цей коментар до офіційних документів MongoDB не підбадьорює, чи це точно?
http://www.mongodb.org/display/DOCS/Aggregation#comment-430445808
Оновлення2:
Здається, нова Структура агрегації відповідає на вищезазначений коментар ... (MongoDB 2.1 / 2.2 і вище, попередній перегляд розробки доступний, не для виробництва)