MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie füge ich ein Dokument bedingt in Mongo ein?

Abgesehen davon, dass Sie das Ganze atomar erledigen können, gibt es zwei Arten von bestehenden Bedingungen, bei denen Sie eine Änderung vornehmen möchten, und Sie können mit jeder von ihnen atomar umgehen:

  • Kein Datensatz für den Schlüssel vorhanden
  • es existiert ein Datensatz für den Schlüssel und seine update_time ist älter als new_time

Aktualisieren Sie einen vorhandenen Datensatz für den Schlüssel:

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

Einfügen, wenn vorher kein Datensatz für Schlüssel vorhanden war:

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

($setOnInsert wurde in MongoDB 2.4 hinzugefügt)

Sie können diese möglicherweise zusammenstellen, um das zu erhalten, was Sie benötigen, z. B.:

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

Je nachdem, welche Entfernungs-/Einfügezeitskalen in Ihrem System möglich sind, benötigen Sie jedoch möglicherweise mehrere Aufrufe (Aktualisieren/Einfügen/Aktualisieren) oder andere Spielereien.

Übrigens:Wenn Sie möchten, dass ein Datensatz die update_time fehlt Feld, das als zu aktualisierender veralteter Datensatz behandelt werden soll, ändern Sie {'$lt': new_time}} zu {'$not': {'$gte': new_time}}