Я просмотрел несколько статей и примеров и еще не нашел эффективный способ сделать этот SQL-запрос в MongoDB (где есть миллионы документов rows)
Первая попытка
(например, из этого почти дублированного вопроса - Монгольский эквивалент 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 для разных учетных записей? или существует эффективный способ?
Обновление:
Этот комментарий к официальным документам MongoDB не обнадеживает, верно ли это?
http://www.mongodb.org/display/DOCS/Aggregation#comment-430445808
Update2:
Кажется, новая структура агрегирования отвечает на вышеупомянутый комментарий... (MongoDB 2.1/2.2 и выше, предварительный просмотр доступен, а не для производства)