我不明白create_index
和ensure_index
pymongo 之间的区别.在MongoDB索引页面上,它说
你可以通过调用来创建一个索引
ensureIndex()
然而,在pymongo有两个不同的命令create_index
和ensure_index
,并为创建索引有文档:
与尝试无条件地创建索引的create_index()不同,ensure_index()利用驱动程序中的某些缓存,以便它只尝试创建可能尚不存在的索引.当PyMongo创建(或确保)索引时,它会被"记住"ttl秒.在该时间限制内重复调用ensure_index()将是轻量级的 - 它们不会尝试实际创建索引.
我是否正确理解ensure_index
将创建一个永久索引,或者我是否需要使用create_index
它?
@ andreas-jung是正确的,这ensure_index()
是一个包装create_index()
,我认为混淆了这句话:
当PyMongo创建(或确保)索引时,它会被"记住"ttl秒.
这不是指数是临时的还是"瞬态的",发生的是在指定的秒数内,ensure_index()
再次尝试创建相同索引的调用不会产生任何影响,也不会create_index()
在下面调用,而是在"缓存"之后调用到期后,ensure_index()
将再次打电话给create_index()
下面.
我完全理解你的困惑,因为坦率地说PyMongo的文档在解释它是如何工作方面做得不是很好,但是如果你转向Ruby文档,解释会更清楚一些:
(String)ensure_index(spec,opts = {})
调用create_index并设置一个标志,以便在另一个X分钟内不再这样做.当将Mongo :: DB对象初始化为选项时,可以将此时间指定为选项[:cache_time]无论缓存时间如何(例如,索引方向的更改),都将传播对索引的任何更改
此方法的参数和选项与Collection#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
我并没有声称司机工作完全相同,只是为了说明目的,他们的解释是一个更好的恕我直言.
请记住,在Mongo 3.x 中,不推荐使用ensureIndex,因此不建议使用.
从3.0.0版开始不推荐使用:db.collection.ensureIndex()现在是db.collection.createIndex()的别名.
在pymongo也一样:
DEPRECATED - 确保此集合上存在索引.
这意味着你应该总是使用create_index
.
在ensureIndex
使用交互Shell和方法ensure_index
在Python驾驶员是不同的东西,虽然相同的字被使用.python驱动程序中的create_index
和ensure_index
方法都永久地创建索引.
也许ensure_index
在这种情况下会使用合理的TTL,因为我不确定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
(function ensureIndex
在文件中搜索collection.js
.)
2)如果它不在"驱动程序缓存"中,它会创建一个索引
在这里使用相同的标识符具有不同的含义,这让我感到困惑.
python和ruby驱动程序在内存中存储有关最近创建的索引的信息,并将这种行为称为"缓存".
他们没有告诉数据库有关此缓存的信息.
这种机制的结果是,如果您使用TTL值(生存时间)第一次调用create_index
或ensure_index
第一次,则驱动程序将在数据库中插入索引并记住此插入并将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
和红宝石驱动程序,def ensure_index
在文件中搜索collection.rb
:
https://github.com/mongodb/mongo-ruby-driver/blob/master/lib/mongo/collection.rb
(请注意,不同的客户端实例不知道其他客户端的缓存,此信息仅保留在内存中,而且是每个实例.如果重新启动客户端应用程序,则新实例不知道旧的"缓存"索引插入.其他客户也不知道,他们不会互相告诉.)
当python驱动程序或ruby驱动程序插入已存在的索引时,我还无法完全理解db中会发生什么.我怀疑他们在这种情况下什么都不做,这更有意义,也会Interactive Shell
和JS驱动程序的行为相匹配.