2011-04-05 8 views
19

Por lo que sería esta consulta en SQL (para encontrar duplicados):¿Cuál es la forma correcta de hacer un TENER en un GRUPO MongoDB?

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

que realiza esta consulta simple en MongoDB:

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

He añadido un simple bucle Javascript para repasar el conjunto de resultados, y se realizó un filtro para buscar todos los campos con un recuento> 1 existe, de este modo:

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

¿hay una mejor manera de hacer esto con excepción de usar código javascript i n el cliente? Si esta es la mejor manera/más simple, dicen que es, y esta pregunta le ayudará a alguien :)

+1

echa un vistazo a la pregunta similar http://stackoverflow.com/questions/4224773/fast-way-to-find-duplicates-on-indexed-column-in-mongodb – RameshVel

+0

Es similar, pero no es lo mismo. Estoy usando una función de grupo, no la función de reducción de mapas de MongoDB. – shlomoid

+0

Pero este sitio que está vinculado a partir de esa respuesta ayuda, con un ejemplo simple: http://csanz.posterous.com/look-for-duplicates-using-mongodb-mapreduce – shlomoid

Respuesta

42

Nueva respuesta usando Mongo marco de la agregación

Después de esta pregunta se le preguntó y respondió, 10gen lanzado la versión 2.2 MongoDB con un marco de agregación. El nuevo mejor manera de hacer esto es consulta:

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 práctico marcadores SQL to Mongo Aggregation conversion chart pena.

Cuestiones relacionadas