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