MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como faço upser condicionalmente um documento no mongo?


Além de ser capaz de fazer tudo atomicamente, existem dois tipos de condições existentes em que você deseja fazer uma mudança, e você pode lidar com cada uma delas atomicamente:
  • não existe nenhum registro para a chave
  • existe um registro para a chave e seu update_time é mais antigo que new_time

Atualize um registro existente para a chave:
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
                                }
                       }
                      )

Insira se um registro para a chave não existia 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 foi adicionado no MongoDB 2.4)

Você pode juntá-los para obter o que precisa, por exemplo:
def update_key(key, new_value, new_time):
    insert_if_missing(key, new_value, new_time)        
    update_if_stale(key, new_value, new_time)

No entanto, dependendo de quais escalas de tempo de remoção/inserção podem ser possíveis em seu sistema, você pode precisar de várias chamadas (atualização/inserção/atualização) ou outras travessuras.

À parte:Se você deseja um registro sem o update_time campo a ser tratado como um registro obsoleto para atualizar, altere {'$lt': new_time}} para {'$not': {'$gte': new_time}}