sql >> Database >  >> NoSQL >> MongoDB

Hoe kan ik een document voorwaardelijk upsereren in Mongo?

Behalve dat je het hele ding atomair kunt doen, zijn er twee soorten bestaande omstandigheden waarin je een verandering wilt aanbrengen, en je kunt elk van hen atomair aanpakken:

  • er bestaat geen record voor de sleutel
  • er bestaat een record voor de sleutel en de update_time is ouder dan new_time

Een bestaande record voor sleutel bijwerken:

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

Invoegen als een record voor sleutel nog niet bestond:

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

($setOnInsert is toegevoegd in MongoDB 2.4)

Je kunt die misschien samenvoegen om te krijgen wat je nodig hebt, bijvoorbeeld:

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

Afhankelijk van welke tijdschalen voor verwijderen/invoegen mogelijk zijn in uw systeem, heeft u mogelijk meerdere oproepen (bijwerken/invoegen/bijwerken) of andere shenanigans nodig.

Terzijde:als je wilt dat een record de update_time . mist veld dat moet worden behandeld als een verouderd record om bij te werken, verander {'$lt': new_time}} naar {'$not': {'$gte': new_time}}



  1. MongoDB en Neo4j samen gebruiken

  2. Mongoose ingesloten documenten / DocumentsArrays id

  3. PyMongo - subdocumenten selecteren uit verzameling op regex

  4. Query MongoDB-array en sorteren met de meest overeenkomende elementen