java - MongoDB 唯一索引不起作用

标签 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") 
}

为什么?

最佳答案

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

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

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

在这里,当我尝试插入具有重复的 customerReference 的文档时,我收到一条错误消息:

E11000 duplicate key error index: 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}

关于java - MongoDB 唯一索引不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21608888/

相关文章:

mongodb - Jenkins - 向 Jenkins 添加自定义网页

sql - 在 MongoDB 上执行相当于 DENSE_RANK 的最佳方法是什么?

node.js - Mongoose 将 strict 设置为 false 会禁用验证

json - 在 grails 2.3.4 中使用 rest 客户端生成器的特定名称出错

groovy - 将成对列表收集到 map 中

Java 同步块(synchronized block)与 concurrentHashMap 与 Collections.synchronizedMap

java - 从 Java 输入流中读取下一个字符(完整的 unicode 代码点)

java - 找不到类的 Hadoop jar 执行失败

json - 在 Grails 中仅输出日期 + 时间的日期部分

java - 如何计算方法描述符的参数数量?