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

MongoDB findAndModify()

W MongoDB db.collection.findAndModify() metoda modyfikuje i zwraca pojedynczy dokument.

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.findAndModify() metodę modyfikacji jednego z tych dokumentów.

db.pets.findAndModify({
    query: { type: "Dog" },
    update: { 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, "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Widzimy, że pierwszy dokument zawiera teraz krowę zamiast psa. Możemy jednak również zauważyć, że pole nazwy dokumentu zniknęło.

To dlatego, że kiedy przekazujesz dokument do update argument, db.collection.findAndModify() wykonuje wymianę.

Korzystanie z operatora aktualizacji

Jeśli chcielibyśmy zaktualizować pole, ale pozostawić resztę dokumentu nienaruszoną, musielibyśmy uwzględnić w naszym dokumencie odpowiednie wyrażenie/wyrażenia operatora aktualizacji.

Mając kolekcję w obecnym stanie, wykonajmy kolejne findAndModify() operacja przeciwko niemu, ale tym razem użyjemy $set zaktualizuj operatora, aby ustawić tylko pole, które chcemy zmienić.

db.pets.findAndModify({
    query: { type: "Dog" },
    update: { $set: { type: "Horse" } }
})

Wynik:

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

Tym razem zaktualizowano pozostałego psa.

Przyjrzyjmy się kolekcji.

db.pets.find()

Wynik:

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

Tym razem odpowiednie pole zostało zaktualizowane, a reszta dokumentu pozostała nienaruszona.

Zwróć zmodyfikowany dokument

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

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

Domyślnie jest to new: false , co powoduje zwrócenie oryginalnego dokumentu. Ale określenie new: true skutkuje zwróceniem zmodyfikowanego dokumentu.

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

db.pets.findAndModify({
    query: { name: "Meow" },
    update: { $set: { name: "Scratch" } },
    new: true
})

Wynik:

{ "_id" : 3, "name" : "Scratch", "type" : "Cat" }

Dlatego zmieniliśmy nazwę na Meow Scratch a wynik odzwierciedla nasze zmiany.

Przewrotki

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

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

Przykład użycia upsert: false

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

db.pets.findAndModify({
    query: { _id: 4 },
    update: { _id: 4, name: "Fetch", type: "Dog" },
    new: true
})

Wynik:

null

Dokument nie istniał w kolekcji, więc findAndModify() 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.findAndModify({
    query: { _id: 4 },
    update: { _id: 4, name: "Fetch", type: "Dog" },
    new: true,
    upsert: true
})

Wynik:

{ "_id" : 4, "name" : "Fetch", "type" : "Dog" }

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

Sprawdźmy ponownie kolekcję.

db.pets.find()

Wynik:

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

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

Parametr arrayFilters

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.findAndModify({
   query: { scores: { $gte: 10 } },
   update: { $set: { "scores.$[e]" : 10 } },
   arrayFilters: [ { "e": { $gte: 10 } } ]
})

Wynik:

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

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.findAndModify() metoda akceptuje również inne parametry, takie jak writeConcern , collation , bypassDocumentValidation i nie tylko.

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Prawdopodobieństwo kolizji ObjectId i UUID w dużym systemie rozproszonym

  2. Spring data mongodb nie zamyka połączeń mongodb

  3. Statystyki wizualne dla Twojego serwera MongoDB

  4. Mongodump ze zdalnego serwera

  5. Błąd krytyczny — nie znaleziono klasy „Mongo”