2014-09-22 1079 views

回答

23

更新2: 最初的答案以及第一次更新錯誤地引用了Mongo shell文檔,而不是Java API。

在Java中,DBCollection.ensureIndex()已在版本2.12中棄用,並在版本3.0中刪除。 DBCollection.createIndex()是應該使用的。

更新:
db.collection.ensureIndex(),因爲3.0.0版本已經過時了。
現在是db.collection.createIndex()的別名。

原文:
createIndex()deprecated since 1.8

它被用來在集合上創建索引,而ensureIndex()如果指數不存在創建指定的索引。此外,當我們執行createIndex()兩次第二次執行將只失敗而與ensureIndex()你可以多次調用它,它會不會失敗

還有一件事,他們改變了關於ensureIndex()行爲,在以前的版本如果現有文檔的索引條目超過最大索引關鍵字長度,則會創建索引,但Mongodb 不會索引這樣的文檔,而在最近的版本中,將不會創建索引

+15

根據[mongodb文檔](http://docs.mongodb.org/manual/reference/method/db.collection.ensureIndex/)'ensureIndex()'已棄用。 – KPrince36 2015-03-18 19:27:29

+1

'createIndex'實際上會軟失敗(至少在3.0)。在隨後的調用中,它將返回「OK」,但也「注」表明「所有索引已經存在」 – PeterM 2017-03-30 07:26:23

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()在版本的Java驅動程序的 2.12.0棄用,DBCollection.createIndex()是你需要使用一個。 DBCollection.ensureIndex()(鏈接到版本2.12)不再適用於DBCollection Java API。

+0

順便說一句,我不能評論@ sol4me的錯誤答案,由於缺乏聲譽,也沒有恢復我錯誤地刪除的原件回答,或爲此事做任何其他事情。 :-( – 2014-10-16 11:26:25

+0

)如果你認爲你是對的,發表寫得很好的答案,而不是那種無用的答案,這將被肯定刪除。 – Dici 2014-10-16 11:26:45

+2

對不起,但我的答案是什麼沒用? @ sol4me錯了,在Java API中,你實際上必須使用createIndex(),我甚至引用了相應的JIRA問題,我在這裏與MongoDB開發人員澄清了這一點... 如果我有答覆那些刪除我的答案的人,我會編輯它,而不是把所有的東西放在那裏,以顯示它是如何被刪除的。事實是,在我甚至與開發者討論事情的努力之後,這對我來說都是非常敵對的,所以我可以給出一個正確的答案 – 2014-10-16 11:30:14

1

java驅動程序(v2.12及更早版本)中的ensureIndex方法將緩存索引是否存在於集合中。由於多個客戶端可能會更改集合上的索引,因此緩存值可能有時會出錯,並且驅動程序無法創建缺少的索引。

由於這個原因,java驅動程序執行createIndex方法具有相同的行爲,但它不會緩存索引狀態。

With drivers 2。12和更高版本,您可以用createIndex替換ensureIndex,並期望相同的行爲,但驅動程序以前認爲該索引已存在並且未將createIndex命令發送到mongo服務器時返回的性能命中除外。

至於爲什麼他們沒有改變沒有重命名的行爲 - 我不知道。

相關問題