日期字段上的MongoDB唯一索引

时间:2013-03-10 14:34:25

标签: 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没有显示在那里

2 个答案:

答案 0 :(得分:3)

如果wall集合中的数据不敏感,您可以调用:

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

所有重复永久删除

答案 1 :(得分:3)

您无法创建具有重复值的索引,如图所示。查找重复值的一种简单方法是使用MongoDB shell中的aggregate查询,例如:

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

这将返回多个event_time文档中包含的所有Wall值的列表。

说明:

  1. event_time_id: "$event_time"
  2. 上的群组
  3. 为每组event_time(唯一时间),在计数中添加一个(count: { $sum: 1}
  4. 然后,仅匹配count大于1
  5. 的组

    然后,您可以决定问题的普遍程度。您可以通过填写find中的event_time值来find所有匹配项,如下所示。当然,它还不会超级快,尚未编入索引。 :)

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

    当然,你可以强行删除重复项(dropDups),如另一个答案所示。但是,结果可能看起来不确定,因为它只会保留在索引阶段找到的第一个文档,而其他所有文档都将被删除。

相关问题