Как удалить повторяющиеся записи из массива?

Как удалить повторяющиеся записи из массива?

В следующем примере дважды добавляются "Алгоритмы в С++".

$unset modifier удаляет определенное поле, но как удалить запись из поля?

> db.users.find()

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

Ответ 1

Что вам нужно сделать, так это использовать сокращение карты для обнаружения и подсчета повторяющихся тегов. Затем используйте $set, чтобы заменить все книги на основе { "_id" : ObjectId("4f6cd3c47156522f4f45b26f"),

Это обсуждалось здесь несколько раз. см.

Удаление дубликатов записей с помощью MapReduce

Быстрый способ поиска дубликатов в индексированном столбце в mongodb

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

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

Как удалить дублируемую запись в MongoDB с помощью MapReduce?

Ответ 2

В соответствии с MongoDB 2.2 вы можете использовать структуру агрегации с этапами $unwind, $group и $project для достижения этого:

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

Обратите внимание на необходимость того, чтобы $project переименовал поле favorites, так как $group агрегированные поля не могут быть вложенными.