sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur kan jag villkorligt upphäva ett dokument i mongo?

Förutom att kunna göra det hela atomärt, det finns två typer av existerande förhållanden där du vill göra en förändring, och du kan hantera var och en av dem atomärt:

  • ingen post för nyckeln finns
  • en post för nyckeln finns och dess update_time är äldre än new_time

Uppdatera en befintlig post för nyckel:

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

Infoga om en post för nyckel inte fanns tidigare:

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

($setOnInsert lades till i MongoDB 2.4)

Du kanske kan sätta ihop dem för att få det du behöver, t.ex.:

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

Beroende på vilka tidsskalor för borttagning/infogning som kan vara möjliga i ditt system, kan du dock behöva flera samtal (uppdatering/infoga/uppdatera) eller andra grejer.

Bortsett från:Om du vill ha en post som saknar update_time fält som ska behandlas som en inaktuell post att uppdatera, ändra {'$lt': new_time}} till {'$not': {'$gte': new_time}}



  1. Hur använder man Elasticsearch med MongoDB?

  2. Internt serverfel vid migrering av Parse till Heroku/AWS

  3. Kan jag skapa en databas med rubyklasser?

  4. Infoga data i MongoDB med PHP