MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come faccio a modificare condizionalmente un documento in mongo?

A parte essere in grado di fare tutto in modo atomico, ci sono due tipi di condizioni esistenti in cui vuoi apportare un cambiamento e puoi gestirle in modo atomico:

  • non esiste alcun record per la chiave
  • esiste un record per la chiave e il relativo update_time è più vecchio di new_time

Aggiorna un record esistente per la chiave:

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
                                }
                       }
                      )

Inserisci se prima non esisteva un record per la chiave:

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

($setOnInsert è stato aggiunto in MongoDB 2.4)

Potresti riuscire a metterli insieme per ottenere ciò di cui hai bisogno, ad esempio:

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

Tuttavia, a seconda di quali scale temporali di rimozione/inserimento potrebbero essere possibili nel tuo sistema, potresti aver bisogno di più chiamate (aggiornamento/inserimento/aggiornamento) o altri trucchi.

A parte:se vuoi che un record manchi il update_time campo da considerare come un record non aggiornato da aggiornare, cambia {'$lt': new_time}} a {'$not': {'$gte': new_time}}