sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo modifico condicionalmente un documento en mongo?

Aparte de poder hacer todo de forma atómica, hay dos tipos de condiciones existentes en las que desea realizar un cambio, y puede tratar cada una de ellas de forma atómica:

  • no existe ningún registro de la clave
  • existe un registro para la clave y su update_time es anterior a new_time

Actualizar un registro existente para clave:

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

Inserte si no existía un registro para la clave antes:

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

($setOnInsert fue agregado en MongoDB 2.4)

Es posible que pueda juntarlos para obtener lo que necesita, por ejemplo:

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

Sin embargo, dependiendo de qué escalas de tiempo de eliminación/inserción sean posibles en su sistema, es posible que necesite varias llamadas (actualizar/insertar/actualizar) u otras travesuras.

Aparte:si desea un registro al que le falte el update_time campo para ser tratado como un registro obsoleto para actualizar, cambiar {'$lt': new_time}} a {'$not': {'$gte': new_time}}