group by - que - ¿Cuál es la forma correcta de hacer HECHO en un GRUPO MongoDB?
mongodb español (1)
Para lo que sería esta consulta en SQL (para encontrar duplicados):
SELECT userId, name FROM col GROUP BY userId, name HAVING COUNT(*)>1
Realicé esta simple consulta en MongoDB:
res = db.col.group({key:{userId:true,name:true},
reduce: function(obj,prev) {prev.count++;},
initial: {count:0}})
He agregado un simple bucle de Javascript para revisar el conjunto de resultados, y he realizado un filtro para encontrar todos los campos con un conteo> 1 allí, así:
for (i in res) {if (res[i].count>1) printjson(res[i])};
¿Hay una forma mejor de hacerlo que no sea usar código javascript en el cliente? Si esta es la forma mejor / más sencilla, diga que lo es, y esta pregunta ayudará a alguien :)
Nueva respuesta usando el marco de agregación de Mongo
Después de que se hizo y se respondió esta pregunta, 10gen lanzó la versión 2.2 de Mongodb con un marco de agregación. La nueva mejor manera de hacer esta consulta es:
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 tiene un útil cuadro de conversión de agregación de SQL a Mongo que vale la pena marcar.