2013-03-10 66 views
2

我嘗試以下的MongoDB的日期字段唯一索引

db.Wall.ensureIndex({event_time : 1}, {unique: true}) 

但這輸出繼續顯示

{ 
    "err" : "E11000 duplicate key error index: scrap.Wall.$event_time_1 dup key: { : new Date(0) }", 
    "code" : 11000, 
    "n" : 0, 
    "connectionId" : 10, 
    "ok" : 1 
} 

我嘗試getIndexes但EVENT_TIME不顯示在那裏

+0

如果此時您的集合中的'event_time'中有重複的值,則無法創建唯一索引。 – beny23 2013-03-10 14:36:14

+0

看起來重複的值是日期(0)如果您使用Date(0)來指示Date尚未設置,則最好不要將該值設置爲0,而是設置爲null,然後您可以使用唯一稀疏強制執行設定日期的索引必須是唯一的。 – 2013-03-10 20:34:45

回答

3

如圖所示,您無法創建具有重複值的索引。尋找重複值的一種簡單的方法,是使用aggregate查詢,從MongoDB的外殼,如:

db.Wall.aggregate([ 
     {$group : { _id: "$event_time" , count : { $sum: 1}}}, 
     {$match : { count : { $gt : 1 } }} ]) 

這將返回存在於多個Wall文檔的所有event_time值的列表。

說明:

  1. 基團上event_time_id: "$event_time"
  2. 每組event_time(唯一的時間),加一計數(count: { $sum: 1}
  3. 然後,只有匹配的那些基團,其中count大於1

然後,您可以決定問題是多麼普遍。如下所示,您可以通過在find中填寫event_time值來匹配所有匹配項。當然,它不會超快,它還沒有被索引。作爲另一個答案:)所示

db.Wall.find({ 'event_time' : /* one of the event times */ }) 

和當然,你可能只是強行刪除重複(dropDups)。但是,結果可能看起來不確定,因爲它只保留在索引階段發現的第一個文檔,其他所有文檔都將被刪除。

3

如果數據在wall收集不敏感,你可以調用:

db.Wall.ensureIndex({event_time : 1}, {unique: true, dropDups: true}) 

所有副本永久刪除

+0

謝謝你這個刪除了一些文件;) – user2152066 2013-03-10 17:29:16