使用mongodb在java中createIndex()和ensureIndex()之间的区别

时间:2014-09-22 07:21:24

标签: java mongodb mongodb-java

使用MongoDB的Java中createIndex()ensureIndex()有什么区别?我用Google搜索了这个,但没有得到满意的答案。

4 个答案:

答案 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()的别名。