2011-03-15 44 views
10

我在某處調用ensureIndex()實際上創建了一個集合,如果它不存在。但索引總是在一些領域,而不是所有的領域,所以如果我確保索引{ name:1 }然後添加文件到該集合有更多的領域,索引將工作?我知道我們沒有來自RDBMS世界的模式,我只是想確定一下。 :)我想在我的網站啓動時創建索引,但最初數據庫是空的。在確保索引之前,我不需要任何數據,這是否正確?可以在不存在的集合上調用ensureIndex嗎?

回答

9

ensureIndex將創建集合,如果它還不存在。如果您添加的文檔沒有索引所涵蓋的屬性,則無關緊要,您無法使用該索引來查找這些文檔。我理解它的方式是,在1.7.4之前的版本中,缺少索引的屬性的文檔將被索引,就像它具有該屬性一樣,但是會爲空值。在1.7.4之後的版本中,您可以創建不包含這些對象的稀疏索引。差異很小,但在某些情況下可能很重要。

根據具體情況,在應用程序啓動時創建索引可能不是一個好主意。考慮在部署新版本時添加新索引的情況,在開發時您不會注意到這一點,因爲您只有一個小型數據庫,但是在生產中您可能擁有龐大的數據庫,並且添加索引需要很多時間的時間。在創建索引期間,您的應用將掛起,您無法提供請求。您可以創建背景標誌設置爲true的索引(語法取決於您使用的驅動程序),但在大多數情況下,最好手動添加索引或作爲安裝腳本的一部分。這樣你在更新索引之前就必須考慮。

+0

我正在使用ASP.NET MVC和官方的C#驅動程序,但我覺得這個問題是技術不可知的。我還沒有想過將索引調用放到我的構建腳本中,但聽起來很有趣,我需要找到如何從命令行調用'ensureIndex'。 – 2011-03-15 14:09:36

+0

我認爲應該可以從通過mongo shell加載的JS腳本調用'ensureIndex'。 – 2011-03-15 14:15:56

+0

您可以使用'mongo db_name script.js'運行JavaScript文件。該文件可以包含您可以在Mongo控制檯中輸入的大部分內容。 – Theo 2011-03-15 14:16:52

相關問題