2012-03-25 106 views
14

如何從數組中刪除重複的條目?如何從數組中刪除重複的條目?

在下面的例子中,「C++中的算法」被添加兩次。

$ unset修飾符刪除特定的字段,但如何從字段中刪除條目?

> db.users.find() 

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

回答

4

你所要做的是使用地圖縮短檢測和計數重複的代碼..然後用$set來取代基於{ "_id" : ObjectId("4f6cd3c47156522f4f45b26f"),

這已經在這裏討論sevel倍整本書..請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

謝謝,非常有用的鏈接.. – 2012-03-26 05:45:54

+1

不要發佈只是鏈接,其中一個現在已經損壞:( – Puce 2015-06-04 10:38:57

30

由於MongoDB的2.2可以使用aggregation framework$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聚合字段不能嵌套。

+0

這是正確的解決方案,如果您需要從聚合框架管道更多的運算符(以統計爲例) 。謝謝Kynan! – 2014-03-01 05:21:16

+2

在'$ group'階段爲什麼你使用'name:{$ first:'$ name'}'? – Towhid 2014-07-09 19:12:47

+0

@Thohid因爲每個unwound條目都有相同的'name',所以你可以帶任何'$ group'階段,所以我只是第一個。 – kynan 2014-07-11 17:35:00