2012-03-25 21 views
14

Come rimuovere le voci duplicate da un array?Come rimuovere le voci duplicate da un array?

Nell'esempio seguente "Algoritmi in C++" viene aggiunto due volte.

Il modificatore di unset $ rimuove un campo particolare ma come rimuovere una voce da 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" } 

risposta

4

Quello che devi fare è usare la mappa di ridurre per rilevare e contare tag duplicati .. poi utilizzare $set per sostituire i libri interi in base { "_id" : ObjectId("4f6cd3c47156522f4f45b26f"),

Questo è stato discusso volte Sevel qui .. per favore 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

Grazie, collegamenti molto utili .. –

+1

Non pubblicare solo collegamenti, uno di questi è ora interrotto :( – Puce

30

Come di MongoDB 2.2 è possibile utilizzare il aggregation framework con una fase $unwind, $group e $project per raggiungere questo obiettivo:

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

nota la necessità di $project per rinominare loCampo 0, poiché i campi aggregati $group non possono essere nidificati.

+0

Questa è la soluzione giusta se è necessario convogliare più operatori dal framework di aggregazione (ad esempio alle statistiche) Grazie Kynan! –

+2

in fase '$ group' perché stai usando' nome: {$ prima: '$ nome'} '? – Towhid

+0

@Towhid Perché ogni voce srotolata ha lo stesso' nome', quindi puoi prendere qualsiasi in la fase '$ group', quindi sto solo prendendo il primo. – kynan

Problemi correlati