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

Jak podmínečně přeložím dokument v mongo?

Kromě toho, že můžete udělat celou věc atomicky, existují dva druhy stávajících podmínek, kdy chcete provést změnu, a s každou z nich se můžete vypořádat atomicky:

  • pro klíč neexistuje žádný záznam
  • existuje záznam pro klíč a jeho update_time je starší než new_time

Aktualizujte existující záznam pro klíč:

def update_if_stale(key, new_value, new_time):
    collection.update({'key': key,
                       'update_time': {'$lt': new_time}
                       },
                      {'$set': {'value': new_value,
                                'update_time': new_time
                                }
                       }
                      )

Vložit, pokud záznam pro klíč dříve neexistoval:

def insert_if_missing(key, new_value, new_time):
    collection.update({'key': key},
                      {'$setOnInsert': {'value': new_value,
                                        'update_time': new_time
                                        }
                       },
                      upsert=True
                      )

($setOnInsert byl přidán do MongoDB 2.4)

Možná je budete moci dát dohromady, abyste získali to, co potřebujete, např.:

def update_key(key, new_value, new_time):
    insert_if_missing(key, new_value, new_time)        
    update_if_stale(key, new_value, new_time)

V závislosti na tom, jaká časová měřítka pro odebrání/vložení by mohla být ve vašem systému možná, budete možná potřebovat více hovorů (aktualizace/vložení/aktualizace) nebo jiné podvody.

Stranou:Pokud chcete, aby v záznamu chyběl parametr update_time pole, které má být považováno za zastaralý záznam pro aktualizaci, změňte {'$lt': new_time}} do {'$not': {'$gte': new_time}}



  1. Jak seřadit sbírku podle data v MongoDB?

  2. Nepřímá úprava přetížené vlastnosti App\Dossier::$program nemá žádný účinek

  3. Aktualizujte položku v poli, které je v poli

  4. WiredTiger a aktualizace na místě