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

MongoDB findOneAndUpdate()

W MongoDB db.collection.findOneAndUpdate() metoda aktualizuje pojedynczy dokument na podstawie filter i sort kryteria.

collection część to nazwa kolekcji, na której ma zostać wykonana operacja.

Przykład

Załóżmy, że mamy kolekcję o nazwie pets który zawiera następujące dokumenty:

{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Możemy użyć db.collection.findOneAndUpdate() metoda aktualizacji jednego z tych dokumentów.

db.pets.findOneAndUpdate(
    { "type": "Dog" },
    { $set: { "type": "Cow" } }
)

Wynik:

{ "_id" : 1, "name" : "Wag", "type" : "Dog" } 

Domyślnie zwraca oryginalny dokument (nie zmodyfikowaną wersję).

Zwróć uwagę, że tylko jeden pies został zaktualizowany, mimo że w kolekcji są dwa psy.

Sprawdźmy kolekcję.

db.pets.find()

Wynik:

{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Widzimy, że pierwszy dokument zawiera teraz krowę zamiast psa.

Zwróć zmodyfikowany dokument

Domyślnie oryginalny dokument jest zwracany po użyciu db.collection.findOneAndUpdate() .

Jeśli wolisz, aby zmodyfikowany dokument został zwrócony, użyj returnNewDocument parametr.

Zróbmy kolejną modyfikację, ale tym razem użyjemy returnNewDocument: true .

db.pets.findOneAndUpdate(
    { "type": "Dog" },
    { $set: { "type": "Horse" } },
    { returnNewDocument: true }
)

Wynik:

{ "_id" : 2, "name" : "Bark", "type" : "Horse" }

Tym razem drugi pies został zaktualizowany. W tym przypadku zmieniliśmy go na konia i widzimy, że dokument zwrotu to odzwierciedla.

Przewrotki

Upsert to opcja, której można używać podczas operacji aktualizacji. Jeśli określony dokument nie istnieje, wstawiany jest nowy. Jeśli tak istnieje, wtedy oryginalny dokument jest aktualizowany (i żaden dokument nie jest wstawiany).

Możesz wykonać upsert, określając upsert: true .

Przykład użycia upsert: false

Po pierwsze, oto przykład próby aktualizacji nieistniejącego dokumentu, gdy upsert: false .

db.pets.findOneAndUpdate(
    { "_id": 4 },
    { $set: { "name": "Barry", "type": "Badger" } },
    { 
        returnNewDocument: true 
    }
)

Wynik:

null

Dokument nie istniał w kolekcji, więc findOneAndUpdate() zwrócono null . Mimo że nie określiliśmy upsert: false , wiemy, że była to fałsz, ponieważ jest to wartość domyślna (tj. jest to wartość używana, gdy nie określisz opcji upsert).

Jeśli jeszcze raz przyjrzymy się kolekcji, zobaczymy, że dokument nie został przewrócony.

db.pets.find()

Wynik:

{ "_id" : 1, "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Horse" }
{ "_id" : 3, "name" : "Scratch", "type" : "Cat" }

Przykład użycia upsert: true

Teraz znowu jest, ale tym razem określamy upsert: true .

db.pets.findOneAndUpdate(
    { "_id": 4 },
    { $set: { "name": "Barry", "type": "Badger" } },
    { 
        upsert: true,
        returnNewDocument: true 
    }
)

Wynik:

{ "_id" : 4, "name" : "Barry", "type" : "Badger" }

Tym razem nowy dokument jest zastępowany i widzimy zastępowany dokument jako wynik (ponieważ określiliśmy returnNewDocument: true ).

Sprawdźmy ponownie kolekcję.

db.pets.find()

Wynik:

{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Horse" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
{ "_id" : 4, "name" : "Barry", "type" : "Badger" }

Widzimy więc, że nowy dokument został w rzeczywistości zamieniony.

Filtry arrayFilters Parametr

Podczas pracy z tablicami możesz użyć arrayFilters parametr wraz z pozycyjnym $ operator, aby określić, które elementy tablicy mają zostać zaktualizowane. Pozwala to zaktualizować element tablicy na podstawie jego wartości, nawet jeśli nie znasz jego pozycji.

Załóżmy na przykład, że mamy kolekcję o nazwie players z następującymi dokumentami:

{ "_id" : 1, "scores" : [ 1, 5, 3 ] }
{ "_id" : 2, "scores" : [ 8, 17, 18 ] }
{ "_id" : 3, "scores" : [ 15, 11, 8 ] }

Moglibyśmy uruchomić następujące zapytanie, aby zaktualizować tylko te elementy tablicy, które mają wartość wyższą niż pewna kwota (w tym przypadku 10).

db.players.findOneAndUpdate(
   { scores: { $gte: 10 } },
   { $set: { "scores.$[e]" : 10 } },
   {
       arrayFilters: [ { "e": { $gte: 10 } } ]
    }
)

Wynik:

{ "_id" : 2, "scores" : [ 8, 17, 18 ] }

Pokazuje dokument przed aktualizacją. Zgodnie z oczekiwaniami aktualizuje to tylko jeden dokument, mimo że dwa dokumenty spełniają kryteria.

Oto, jak teraz wyglądają dokumenty.

db.players.find()

Wynik:

{ "_id" : 1, "scores" : [ 1, 5, 3 ] }
{ "_id" : 2, "scores" : [ 8, 10, 10 ] }
{ "_id" : 3, "scores" : [ 15, 11, 8 ] }

W dokumencie 2 zaktualizowano dwa elementy tablicy, ponieważ te elementy spełniały kryteria.

Więcej informacji

db.collection.findOneAndUpdate() metoda akceptuje również inne parametry, takie jak projection (aby określić podzbiór pól do zwrócenia), sort , maxTimeMS i collation .

Zobacz dokumentację MongoDB dla db.collections.findOneAndUpdate() aby uzyskać więcej informacji.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. 5 sposobów na wstawianie dokumentów do MongoDB

  2. Jak wysłać zapytanie do mongodb za pomocą „polubienia” za pomocą java api?

  3. Mongoose:porównania identyfikatorów obiektów kończą się niepowodzeniem

  4. Jak pobrać szczegóły z mongo db i wysłać lub zapisać w obiekcie w metodzie nodejs Fork?

  5. Zmień nazwę pola w kolekcji MongoDB