Fin*_*ive 5 java groovy mongodb
我正在使用 Java 中的 Mongodb。
我创建一个集合和一个索引,如下所示:
collection = mongoClient.getDB(DB_NAME).getCollection(COLLECTION_NAME)
collection.ensureIndex(new BasicDBObject(['customerReference': 1, 'unique': true]))
Run Code Online (Sandbox Code Playgroud)
当我检查 mongo shell 时,我看到:
{
"v" : 1,
"key" : { "customerReference" : 1, "unique" : true },
"ns" : "diagnostics.diagnosticData",
"name" : "customerReference_1_unique_"
}
Run Code Online (Sandbox Code Playgroud)
但我仍然可以插入重复项:
{
"_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")
}
Run Code Online (Sandbox Code Playgroud)
为什么?
可能是你没有正确创建索引。
通过执行以下语句从 DB shell 执行此操作:
db.refs.ensureIndex({customerReference: 1}, {unique : true})
Run Code Online (Sandbox Code Playgroud)
在这里,当我尝试插入具有重复项的文档时,customerReference
我收到一条错误,提示:
E11000 重复键错误索引:test.refs.$customerReference_1 重复键:{ : 3.0 }
当我执行db.refs.getIndexes()
命令时,我得到:
{
"v" : 1,
"key" : {
"customerReference" : 1
},
"unique" : true,
"ns" : "test.refs",
"name" : "customerReference_1"
}
Run Code Online (Sandbox Code Playgroud)
这表明唯一索引已正确创建,但与您的稍有不同。
更新:当您确保集合中的索引时,您只创建一个 BasicDBObject
,这将导致:
"key" : { "customerReference" : 1, "unique" : true }
Run Code Online (Sandbox Code Playgroud)
此处, 的值key
不应包含该unique
属性。
该unique
属性应该放置在index
文档中,就像我的代码中一样:
"key" : {
"customerReference" : 1
},
"unique" : true
Run Code Online (Sandbox Code Playgroud)
要正确创建索引,您必须提供两个 BasicDBObjects
:
{customerReference : 1}
{unique : true}
归档时间: |
|
查看次数: |
5192 次 |
最近记录: |