2012-02-14 101 views
1

我是NoSQL的新手,非常抱歉,如果這是非常基本的。比方說,我有以下的集合:Dedupe MongoDB Collection

{ 
    a: 1, 
    b: 2, 
    c: 'x' 
}, 
{ 
    a: 1, 
    b: 2, 
    c: 'y' 
}, 
{ 
    a: 1, 
    b: 1, 
    c: 'y' 
} 

我想運行在任何匹配的「重複數據刪除」查詢:查詢運行

所以經過
{ 
    a: 1, 
    b: 2 
    ... (any other properties are ignored) ... 
}, 

,或者在下面剩餘的收集就可以了:

{ 
    a: 1, 
    b: 2, 
    c: 'y' 
}, 
{ 
    a: 1, 
    b: 1, 
    c: 'y' 
} 

OR

{ 
    a: 1, 
    b: 2, 
    c: 'x' 
}, 
{ 
    a: 1, 
    b: 1, 
    c: 'y' 
} 

只要只有一個文檔剩餘== 1和b == 2。

回答

6

如果你總是希望確保只有一個文件有任何給定的ab組合,您可以在ab使用唯一索引。當創建索引,你可以給dropDups選項,這將刪除所有,但一個重複:

db.collection.ensureIndex({a: 1, b: 1}, {unique: true, dropDups: true}) 
+0

該死的,忘記了:) – 2012-02-14 01:45:20

+0

這不適用於所有可能的情況下(例如,{a:{$ in:[1,2]}}),但是唯一的單一命令解決方案(儘管如果您實際上不需要索引,您可能希望直接刪除索引) – 2012-02-14 11:58:10

+0

這是否適用於嵌入式文檔? – Jeff 2014-04-04 03:25:24

0

我不知道會就地更新您的集合中的任何命令,但你肯定能行通過臨時存儲。

  1. 組文檔通過您的標準(領域ab
  2. 對於每個組從中挑選任何文件。將它保存到臨時集合tmp。放棄組中的其他人。
  3. tmp中的文檔覆蓋原始集合。

您可以使用MapReduce或即將到來的Aggregation Framework(目前位於不穩定分支)執行此操作。

我決定不在這裏寫代碼,因爲它需要學習離開你的快樂。 :)