MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Pymongo / MongoDB:Index erstellen oder Index sicherstellen?

@andreas-jung hat recht damit ensure_index() ist ein Wrapper über create_index() , ich denke, die Verwirrung entsteht mit dem Satz:

Wenn ein Index von PyMongo erstellt (oder sichergestellt) wird, wird er für ttlseconds „erinnert“.

Es ist nicht so, dass der Index temporär oder "transient" ist, was passiert, ist, dass während der angegebenen Anzahl von Sekunden ein Aufruf von ensure_index() erfolgt Der Versuch, denselben Index erneut zu erstellen, wird nicht Auswirkungen haben und nicht haben rufen Sie create_index() auf darunter, aber nachdem dieser "Cache" abgelaufen ist, ein Aufruf von ensure_index() wird Rufen Sie erneut create_index() auf darunter.

Ich verstehe Ihre Verwirrung vollkommen, weil die Dokumentation von PyMongo ehrlich gesagt nicht sehr gut darin ist, zu erklären, wie das funktioniert, aber wenn Sie zu den Ruby-Dokumenten gehen, ist die Erklärung etwas klarer:

  • (String) sure_index(spec, opts ={})

Ruft create_index auf und setzt ein Flag, um dies für weitere X Minuten nicht erneut zu tun. Diese Zeit kann als Option angegeben werden, wenn ein Mongo::DBobject als options[:cache_time] initialisiert wird. Alle Änderungen an einem Index werden unabhängig von der Cache-Zeit weitergegeben (z. B. a Änderung der Indexrichtung)

Die Parameter und Optionen für thismethods sind dieselben wie für Collection#create_index.

Beispiele:

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

Ich behaupte nicht, dass Treiber genau gleich funktionieren, es ist nur so, dass ihre Erklärung zu Illustrationszwecken IMHO etwas besser ist.