MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak warunkowo zmienić dokument w mongo?

Poza tym, że nie jesteś w stanie zrobić wszystkiego atomowo, istnieją dwa rodzaje istniejących warunków, w których chcesz dokonać zmiany, i możesz poradzić sobie z każdym z nich atomowo:

  • brak wpisu dla klucza
  • istnieje rekord klucza i jego update_time jest starszy niż new_time

Zaktualizuj istniejący rekord dla klucza:

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

Wstaw, jeśli rekord dla klucza nie istniał wcześniej:

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

($setOnInsert został dodany w MongoDB 2.4)

Możesz je połączyć, aby uzyskać to, czego potrzebujesz, np.:

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

Jednak w zależności od tego, jakie skale czasu usuwania/wstawiania mogą być możliwe w twoim systemie, możesz potrzebować wielu wywołań (aktualizacja/wstawianie/aktualizacja) lub innych sztuczek.

Na bok:jeśli chcesz, aby rekord nie zawierał update_time pole, które ma być traktowane jako przestarzały rekord do aktualizacji, zmień {'$lt': new_time}} do {'$not': {'$gte': new_time}}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Limit =1 =1 ms, Limit> 1 =150 ms (mongo-melt-down)

  2. MongoDB usuń kolekcję mapreduce

  3. Zapytanie mongoDB używające agregacji do zapytania o najnowszą datę elementu

  4. pobierz wartości według nazwy klucza mongodb node.js driver

  5. Jakie jest wyjście strumienia plików w potoku?