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