university tutorial example descargar caracteristicas mongodb

mongodb - tutorial - ¿Cómo eliminar entradas duplicadas de una matriz?



mongodb tutorial (3)

A partir de MongoDB 2.2, puede utilizar el marco de agregación con una etapa $unwind , $group y $project para lograr esto:

db.users.aggregate([{$unwind: ''$favorites.books''}, {$group: {_id: ''$_id'', books: {$addToSet: ''$favorites.books''}, name: {$first: ''$name''}}}, {$project: {''favorites.books'': ''$books'', name: ''$name''}} ])

Tenga en cuenta la necesidad de que el $project cambie el nombre del campo de favorites , ya $group los campos agregados de $group no se pueden anidar.

¿Cómo eliminar entradas duplicadas de una matriz?

En el siguiente ejemplo, "Algoritmos en C ++" se agrega dos veces.

El modificador $ unset elimina un campo en particular, pero ¿cómo eliminar una entrada de un campo?

> db.users.find() { "_id" : ObjectId("4f6cd3c47156522f4f45b26f"), "favorites" : { "books" : [ "Algorithms in C++", "The Art of Computer Programmning", "Graph Theory", "Algorithms in C++" ] }, "name" : "robert" }


La solución más fácil es usar setUnion (Mongo 2.6+):

db.users.aggregate([ {''$addFields'': {''favorites.books'': {''$setUnion'': [''$favorites.books'', []]}}} ])

Otra versión (más larga) que se basa en la idea de la answer de @kynan, pero conserva todos los otros campos sin especificarlos explícitamente (Mongo 3.4+):

> db.users.aggregate([ {''$unwind'': { ''path'': ''$favorites.books'', // output the document even if its list of books is empty ''preserveNullAndEmptyArrays'': true }}, {''$group'': { ''_id'': ''$_id'', ''books'': {''$addToSet'': ''$favorites.books''}, // arbitrary name that doesn''t exist on any document ''_other_fields'': {''$first'': ''$$ROOT''}, }}, { // the field, in the resulting document, has the value from the last document merged for the field. (c) docs // so the new deduped array value will be used ''$replaceRoot'': {''newRoot'': {''$mergeObjects'': [''$_other_fields'', "$$ROOT"]}} }, // this stage wouldn''t be necessary if the field wasn''t nested {''$addFields'': {''favorites.books'': ''$books''}}, {''$project'': {''_other_fields'': 0, ''books'': 0}} ]) { "_id" : ObjectId("4f6cd3c47156522f4f45b26f"), "name" : "robert", "favorites" : { "books" : [ "The Art of Computer Programmning", "Graph Theory", "Algorithms in C++" ] } }


Lo que tienes que hacer es usar map reduce para detectar y contar etiquetas duplicadas ... luego usa $set para reemplazar los libros completos basados ​​en { "_id" : ObjectId("4f6cd3c47156522f4f45b26f"),

Esto ha sido discutido varias veces aquí .. por favor vea

Eliminar registros duplicados usando MapReduce

Forma rápida de encontrar duplicados en la columna indexada en mongodb

http://csanz.posterous.com/look-for-duplicates-using-mongodb-mapreduce

http://www.mongodb.org/display/DOCS/MapReduce

¿Cómo eliminar el registro duplicado en MongoDB por MapReduce?