MongoDB唯一索引不起作用

时间:2014-02-06 16:45:40

标签: java mongodb groovy

我正在使用Java中的Mongodb。

我创建了一个像这样的集合和索引:

collection = mongoClient.getDB(DB_NAME).getCollection(COLLECTION_NAME)
collection.ensureIndex(new BasicDBObject(['customerReference': 1, 'unique': true]))

当我签入mongo shell时,我看到了:

{ 
   "v" : 1, 
   "key" : { "customerReference" : 1, "unique" : true }, 
   "ns" : "diagnostics.diagnosticData", 
    "name" : "customerReference_1_unique_" 
}

但我仍然可以插入重复项:

{ 
  "_id" : ObjectId("52f3ba8a7d841c01680e0bc5"), 
  "customerReference" : 3, 
  "data" : "original data", 
  "created" : ISODate("2014-02-06T16:38:34.191Z") 
}
{ 
  "_id" : ObjectId("52f3ba8a7d841c01680e0bc6"), 
  "customerReference" : 3, 
  "data" : "duplicate data", 
  "created" : ISODate("2014-02-06T16:38:34.194Z") 
}

为什么?

2 个答案:

答案 0 :(得分:2)

可能您没有正确创建索引。

通过执行以下语句从DB shell执行此操作:

db.refs.ensureIndex({customerReference: 1}, {unique : true})

在这里,当我尝试插入包含重复customerReference的文档时,我收到错误,说:

  

E11000重复键错误索引:test.refs。$ customerReference_1 dup key:{:3.0}

当我执行db.refs.getIndexes()命令时,我得到:

{
    "v" : 1,
    "key" : {
        "customerReference" : 1
     },
     "unique" : true,
     "ns" : "test.refs",
     "name" : "customerReference_1"
 }

表示正确创建了唯一索引,但与您的索引略有不同。

<强>更新: 当您确保集合中的索引时,您只需 BasicDBObject,这将导致:

"key" : { "customerReference" : 1, "unique" : true }

此处,key的值不应包含unique属性。

unique属性应放在index文档中,就像我的代码一样:

"key" : {
     "customerReference" : 1
 },
 "unique" : true

要正确创建索引,您必须提供两个 BasicDBObjects

  • 一个{customerReference : 1}
  • 一个{unique : true}

答案 1 :(得分:0)

我在使用JavaScript的猫鼬,但我认为找到的解决方案也适用于其他语言... 当您将数据库与应用程序连接时,请添加以下选项:“ audoIndex:true” 例如在JS中,我们将执行以下操作:

const options = {
// your options go here
...
// this code is the solution
audoIndex: true
}
mongoose.connect(DB_URI, options);

我还删除了我遇到问题的集合,并重新创建了它以确保它可以工作。 我在以下位置找到了该解决方案:https://dev.to/emmysteven/solved-mongoose-unique-index-not-working-45d5 我还尝试了“重启MongoDB”之类的解决方案,但对我不起作用。