ensureIndex
Interactive Shell 和python 驱动程序中的方法ensure_index
是不同的东西,尽管使用的是同一个词。create_index
python 驱动程序中的and方法都ensure_index
永久创建索引。
在这种情况下,也许有人会使用ensure_index
合理的 TTL,因为我不确定create_index
每次调用它时是否会重新创建索引。通常不需要娱乐,这可能是一项繁重的操作。但是,即使ensure_index
(python 或 ruby 驱动程序)也可能在 TTL 过期或从不同的客户端实例调用它或重新启动后重新创建索引。我不确定这一点。
也许更好的可能性是首先使用方法检查index_information()
索引是否已经存在。如果它已经存在,您将不会再次创建它。
我现在正在演示如何以 2 个不同的含义使用术语ensure_index
(或):ensureIndex
1)如果数据库中尚不存在索引,则创建索引
这就是交互式 Shell方法的ensureIndex()
作用:
http://www.mongodb.org/display/DOCS/Indexes#Indexes-Basics
也有Node.JS MongoDB Driver
这样的行为:
https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/collection.js
function ensureIndex
(在文件中搜索collection.js
。)
2)如果它不在“驱动程序缓存”中,它会创建一个索引
在这里使用相同的标识符具有不同的含义,我觉得这很混乱。
python 和 ruby 驱动程序将有关最近创建的索引的信息存储在内存中,他们称这种行为为“缓存”。
他们不会告诉数据库有关此缓存的信息。
这种机制的结果是,如果您第一次调用create_index
或ensure_index
使用 TTL 值(生存时间),那么驱动程序将在数据库中插入索引并记住此插入并将 TTL 信息存储在内存中。这里缓存的是时间和它是哪个索引。
下次您ensure_index
在同一驱动程序实例上使用同一集合的相同索引调用ensure_index
时,如果自第一次调用以来尚未经过 TTL 秒,则该命令只会再次插入索引。
如果你调用create_index
,索引将始终被插入,无论自第一次调用以来经过了多少时间,当然如果这是第一次调用也是如此。
这是python驱动,def ensure_index
在文件中搜索collection.py
:
https://github.com/mongodb/mongo-python-driver/blob/master/pymongo/collection.py
和 ruby 驱动程序,def ensure_index
在文件中搜索collection.rb
:
https://github.com/mongodb/mongo-ruby-driver/blob/master/lib/mongo/collection.rb
(请注意,不同的客户端实例不知道其他客户端实例的缓存,此信息仅保存在内存中,并且是每个实例的。如果重新启动客户端应用程序,新实例不知道旧的“缓存”索引插入。其他客户也不知道,他们不会互相告诉。)
我还不能完全理解,当 python 驱动程序或 ruby 驱动程序插入一个已经存在的索引时,数据库中会发生什么。我怀疑他们在这种情况下什么都不做,这更有意义,并且也与Interactive Shell
JS 驱动程序的行为相匹配。