Pymongo / MongoDB:创建索引还是确保索引?

| 我不明白pymongo中
create_index
ensure_index
之间的区别。在MongoDB索引页面上,它说   您可以通过调用   
ensureIndex()
但是在pymongo中,有两个不同的命令
create_index
ensure_index
,并且create index的文档具有:   与create_index()不同,后者尝试   无条件创建索引,   sure_index()利用了一些   在驱动程序内进行缓存   只尝试创建索引   可能不存在。当索引   由PyMongo创建(或确保)   被“记住” ttl秒。   重复调用sure_index()   在此期限内   轻巧-他们不会尝试   实际创建索引。 我理解understanding1将创建一个永久索引是正确的,还是我需要为此使用
create_index
?     
已邀请:
请记住,在Mongo 3.x中,ensureIndex已弃用,不建议使用。   从3.0.0版开始不推荐使用:db.collection.ensureIndex()现在是db.collection.createIndex()的别名。 pymongo中也是如此:   已弃用-确保此集合上存在索引。 这意味着您应始终使用
create_index
。     
@ andreas-jung是正确的,因为
ensure_index()
create_index()
的包装,我认为这句话会引起混淆:   创建(或确保)索引时   被PyMongo记住是ttl   秒。 并不是索引是临时的或“瞬态的”,而是在指定的秒数内,调用
ensure_index()
试图再次创建相同的索引不会产生任何效果,也不会在下面调用
create_index()
,但是在\“ cache \”过期后,对
ensure_index()
的调用将再次在下面调用
create_index()
。 我完全理解您的困惑,因为坦率地说,PyMongo的文档在解释其工作原理方面做得不好,但是如果您使用Ruby文档,则说明会更加清晰:      (字符串)sure_index(spec,opts = {})         调用create_index并将标志设置为   再过X分钟就不再这样做。   这次可以指定为   Mongo :: DB初始化时的选项   对象作为选项[:cache_time]任何   索引更改将被传播   不管缓存时间如何   (例如,更改索引方向)      为此的参数和选项   方法与用于   集合#create_index。      例子:      
Call sequence:
     
Time t: @posts.ensure_index([[\'subject\', Mongo::ASCENDING])  -- calls create_index and sets the 5 minute cache
     
Time t+2min : @posts.ensure_index([[\'subject\', Mongo::ASCENDING])  -- doesn\'t do anything
     
Time t+3min : @posts.ensure_index([[\'something_else\', Mongo::ASCENDING])  -- calls create_index and sets 5 minute cache
     
Time t+10min : @posts.ensure_index([[\'subject\', Mongo::ASCENDING])  -- calls create_index and resets the 5 minute counter
我并不是说驱动程序的工作原理完全相同,只是出于说明目的,对它们的解释有些恕我直言。     
尽管使用了相同的单词,但Interactive Shell中的
ensureIndex
方法和python驱动程序中的
ensure_index
是不同的东西。 python驱动程序中的
create_index
ensure_index
方法均会永久创建一个索引。 在这种情况下,也许有人会使用带有合理TTL的
ensure_index
,因为我不确定每次调用
create_index
是否会重新创建索引。通常情况下,休闲娱乐是不希望的,并且可能会很麻烦。但是,即使TTL过期,从其他客户端实例调用它或重新启动后,即使是python或ruby驱动程序的
ensure_index
也可以重新创建索引。我对此不确定。 甚至更好的可能性是,使用
index_information()
方法首先检查索引是否已存在。如果已经存在,则不会再次创建。 我现在演示如何将术语“ 1”(或“ 19”)用于两种不同的含义: 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驱动程序将有关最近创建的索引的信息存储在内存中,他们称此行为为'caching \'。 他们不告诉数据库有关此缓存的信息。 这种机制的结果是,如果您第一次使用TTL值(生存时间)调用
create_index
ensure_index
,则驱动程序将在数据库中插入索引,并将记住该插入并将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 (请注意,不同的客户端实例不知道其他客户端的缓存,该信息仅保留在内存中,并且是每个实例的信息。如果重新启动客户端应用程序,则新实例不知道旧的“ cached”索引插入。其他客户也不知道,他们彼此不告诉对方。) 我还不能完全理解,当python驱动程序或ruby驱动程序插入已经存在的索引时,db中会发生什么。我怀疑它们在这种情况下什么也不做,这更有意义,并且也与
Interactive Shell
和JS驱动程序的行为匹配。     
所有索引都是永久的。 sure_index()只是create_index()的一个小包装。 \“ \” \“ sureIndex()函数仅在不存在索引时创建索引。 \“ \” \“ 没有什么比临时索引或临时索引更合适了。     
我建议创建元类和ORM。 从元类init调用init_schema方法以初始化计数器,架构,键等。 这样,您就可以避免在每次查询或集合更新时调用sure_index:     

要回复问题请先登录注册