Как правильно сделать HAVING в MongoDB GROUP BY? - PullRequest
26 голосов
/ 05 апреля 2011

Для чего бы этот запрос в SQL (чтобы найти дубликаты):

SELECT userId, name FROM col GROUP BY userId, name HAVING COUNT(*)>1

Я выполнил этот простой запрос в MongoDB:

res = db.col.group({key:{userId:true,name:true}, 
                     reduce: function(obj,prev) {prev.count++;}, 
                     initial: {count:0}})

Я добавил простой JavascriptЦикл, чтобы просмотреть набор результатов, и выполнил фильтр, чтобы найти все поля с количеством> 1, например:

for (i in res) {if (res[i].count>1) printjson(res[i])};

Есть ли лучший способ сделать это, кроме использования кода JavaScript вклиент?Если это лучший / самый простой способ, скажите, что это так, и этот вопрос кому-то поможет:)

1 Ответ

49 голосов
/ 23 мая 2013

Новый ответ с использованием платформы агрегации Mongo

После того, как на этот вопрос был задан и получен ответ, 10gen выпустила Mongodb версии 2.2 со структурой агрегации.Новый лучший способ выполнить этот запрос:

db.col.aggregate( [
   { $group: { _id: { userId: "$userId", name: "$name" },
               count: { $sum: 1 } } },
   { $match: { count: { $gt: 1 } } },
   { $project: { _id: 0, 
                 userId: "$_id.userId", 
                 name: "$_id.name", 
                 count: 1}}
] )

10gen имеет удобную таблицу преобразования SQL в Mongo Aggregation стоит добавить в закладки.

...