sql >> Databáze >  >> NoSQL >> MongoDB

Pymongo / MongoDB:vytvořit index nebo zajistit index?

@andreas-jung má pravdu v tom ensure_index() je obal nad create_index() , Myslím, že zmatek vzniká u fráze:

Když PyMongo vytvoří (nebo zajistí) index, je „zapamatován“ po dobu ttlsekund.

Nejde o to, že by index byl dočasný nebo „přechodný“, stane se to, že během zadaného počtu sekund dojde k volání funkce ensure_index() pokus o vytvoření stejného indexu znovu nebude mít žádný účinek a nebude zavolejte create_index() pod, ale poté, co tato "mezipaměť" vyprší, volání funkce ensure_index() bude znovu zavolejte create_index() pod.

Dokonale rozumím vašemu zmatku, protože upřímně řečeno, dokumenty PyMongo neodvádějí příliš dobrou práci ve vysvětlování toho, jak to funguje, ale pokud zamíříte do dokumentů Ruby, vysvětlení je trochu jasnější:

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

Zavolá create_index a nastaví příznak, aby se tak nestalo znovu po dobu dalších X minut. tento čas lze zadat jako volbu při inicializaci Mongo::DBobject jako options[:cache_time] Jakékoli změny indexu budou přeneseny bez ohledu na čas mezipaměti (např. změna směru indexu)

Parametry a možnosti pro tyto metody jsou stejné jako u Collection#create_index.

Příklady:

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

Netvrdím, že ovladače fungují úplně stejně, jen pro ilustrační účely je jejich vysvětlení IMHO o něco lepší.



  1. Jak převést řetězec na objectId v LocalField pro $lookup Mongodb

  2. Upozornění na připojení k MongoDB pomocí serveru Node

  3. Vytvořte aplikaci pro psaní poznámek pro Android pomocí MongoDB Stitch

  4. Proč Laravel Redis::scan('*') vrací očekávaný klíč, ale Redis::keys('*') ne?