Каков правильный способ сделать HAVING в группе MongoDB GROUP BY?
Для чего будет этот запрос в 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, чтобы перейти к набору результатов, и выполнил фильтр, чтобы найти все поля с числом count > 1, например:
for (i in res) {if (res[i].count>1) printjson(res[i])};
Есть ли лучший способ сделать это, кроме использования javascript-кода в клиенте?
Если это лучший/самый простой способ, скажите, что это так, и этот вопрос поможет кому-то:)
Ответы
Ответ 1
Новый ответ с использованием инфраструктуры агрегации 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 to Mongo Aggregation, которая стоит закладок.