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?