2012-03-25 25 views
14

¿Cómo eliminar las entradas duplicadas de una matriz?¿Cómo eliminar las entradas duplicadas de una matriz?

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

$ unset modifier 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" } 

Respuesta

4

Lo que tienes que hacer es usar MapReduce para detectar y contar las etiquetas duplicadas .. entonces utilizar $set para reemplazar los libros enteros sobre la base de { "_id" : ObjectId("4f6cd3c47156522f4f45b26f"),

Esto ha sido discutido veces Sevel aquí .. por favor seee

Removing duplicate records using MapReduce

Fast way to find duplicates on indexed column in mongodb

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

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

How to remove duplicate record in MongoDB by MapReduce?

+0

Gracias, enlaces muy útiles .. –

+1

No publique solo enlaces, uno de ellos ahora está roto :( – Puce

30

A partir de MongoDB 2.2 se puede utilizar el aggregation framework con una etapa $unwind, $group y $project para lograrlo:

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

nota la necesidad de la $project para cambiar el nombre al favorites campo, ya que $group campos agregados no se pueden anidar.

+0

Esa es la solución correcta si necesita canalizar más operadores desde el marco de agregación (a estadísticas, por ejemplo) Gracias Kynan! –

+2

en la etapa '$ group' ¿por qué estás usando' name: {$ first: '$ name'} '? – Towhid

+0

@Towhid Porque cada entrada desenrollada tiene el mismo' nombre', por lo que puedes tomar cualquier la etapa '$ group', así que solo tomo el primero. – kynan

Cuestiones relacionadas