使用MongoDB的Java中createIndex()
和ensureIndex()
有什么区别?我用Google搜索了这个,但没有得到满意的答案。
答案 0 :(得分:28)
更新2: 原始答案以及第一次更新错误地引用了Mongo shell文档而不是Java API。
在Java中,DBCollection.ensureIndex()
在版本2.12中已弃用,在版本3.0中已删除。 DBCollection.createIndex()
是应该使用的。
<强>更新强>
自版本3.0.0起,db.collection.ensureIndex()
已弃用
现在是db.collection.createIndex()的别名。
<强>原始强>
createIndex()
是deprecated since 1.8
它用于在集合上创建索引,而ensureIndex()
在指定的字段上创建索引(如果索引尚不存在)。此外,当我们执行createIndex()
两次时,第二次执行只会失败,而使用ensureIndex()
,您可以多次调用它,不会失败
如果现有文档的索引条目超过最大索引密钥长度,则索引会在以前版本的mongodb(版本小于2.6)中对ensureIndex()
的行为进行更改创建但Mongodb 不会索引此类文档,而在最新版本中不会创建索引。
答案 1 :(得分:14)
在Java API中,DBCollection.ensureIndex()
不推荐使用,与“普通”MongoDB API(在响应时)相比,完全相反。 更新:此不一致似乎已经解决,db.collection.createIndex()
现在也替换了Mongo shell中的db.collection.ensureIndex()
。
正如您在https://jira.mongodb.org/browse/JAVA-1097中所看到的,在Java中(OP询问的)ensureIndex()
在版本中已被弃用
2.12.0的Java驱动程序,DBCollection.createIndex()
是您需要使用的。 DBCollection.ensureIndex()
(链接到版本2.12)在DBCollection Java API中不再可用。
答案 2 :(得分:1)
在java驱动程序(v2.12及更早版本)中找到的ensureIndex
方法将缓存集合中是否存在索引。由于多个客户端可能会更改集合上的索引,因此缓存值有时可能是错误的,并且驱动程序将无法创建缺失的索引。
出于这个原因,java驱动程序实现了一个具有相同行为的createIndex
方法,除了它不会缓存索引状态。
使用驱动程序2.12及更高版本,您可以将ensureIndex
替换为createIndex
并期望相同的行为,但驱动程序以前认为索引已经存在并返回而不发送对mongo服务器的createIndex命令。
至于为什么他们在没有重命名的情况下没有改变行为 - 我不知道。
答案 3 :(得分:1)
从版本3.0.0开始不推荐使用: db.collection.ensureIndex()现在是db.collection.createIndex()的别名。