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

Aktualizuj dokumenty w MongoDB

1. Przegląd

MongoDB to wieloplatformowa, zorientowana na dokumenty baza danych NoSQL typu open source, napisana w C++. Ponadto MongoDB zapewnia wysoką wydajność, wysoką dostępność i automatyczne skalowanie.

Aby zaktualizować dokumenty w MongoDB, możemy użyć różnych metod, takich jak updateOne , znajdźOneAndUpdate, itp. Ponadto MongoDB udostępnia różne operatory metod aktualizacji.

W tym samouczku omówimy różne podejścia do wykonywania operacji aktualizacji w MongoDB. Dla każdego podejścia najpierw omówimy zapytanie powłoki mongo, a następnie jego implementację w Javie.

2. Konfiguracja bazy danych

Zanim przejdziemy do zapytań aktualizujących, utwórzmy najpierw bazę danych, baeldung oraz zbiór próbek, uczeń:

use baeldung;
db.createCollection(student);

Jako ilustrację dodajmy kilka dokumentów do kolekcji student za pomocą insertMany zapytanie:

db.student.insertMany([
    {
        "student_id": 8764,
        "student_name": "Paul Starc",
        "address": "Hostel 1",
        "age": 16,
        "roll_no":199406
    },
    {
        "student_id": 8765,
        "student_name": "Andrew Boult",
        "address": "Hostel 2",
        "age": 18,
        "roll_no":199408
    }
]);

Po udanym wstawieniu otrzymamy JSON z acknowledged:true :

{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("621b078485e943405d04b557"),
	ObjectId("621b078485e943405d04b558")
    ]
}

Przyjrzyjmy się teraz różnym sposobom aktualizowania dokumentów w MongoDB.

3. Korzystanie z updateOne Metoda

Operację aktualizacji w MongoDB można wykonać poprzez dodanie nowego pola, usunięcie pola lub aktualizację istniejącego pola. updateOne Metoda aktualizuje pojedynczy dokument w kolekcji na podstawie zastosowanego filtru zapytania. Najpierw znajduje dokument, który pasuje do filtra, a następnie aktualizuje określone pola.

Ponadto możemy używać różnych operatorów, takich jak $set , $nieskonfigurowane , $inc itp. za pomocą metody aktualizacji.

Aby to zademonstrować, przyjrzyjmy się zapytaniu, aby zaktualizować pojedynczy dokument z kolekcji:

db.student.updateOne(
    { 
        "student_name" : "Paul Starc"
    },
    { 
        $set: {
            "address" : "Hostel 2"
        }
    }
 );

Otrzymamy wynik podobny do pokazanego poniżej:

{
    "acknowledged":true,
    "matchedCount":1,
    "modifiedCount":1
}

Sprawdźmy teraz kod sterownika Java powyższego updateOne zapytanie:

UpdateResult updateResult = collection.updateOne(Filters.eq("student_name", "Paul Starc"),
Updates.set("address", "Hostel 2"));

Tutaj najpierw użyliśmy nazwa_ucznia pole do filtrowania dokumentów. Następnie aktualizujemy adres dokumentu o nazwa_ucznia „Paweł Starc”.

4. Korzystanie z updateMany Metoda

aktualizacjaWiele Metoda aktualizuje wszystkie dokumenty w kolekcjach MongoDB, które pasują do podanego filtra. Jedna z zalet korzystania z updateMany jest to, że możemy aktualizować wiele dokumentów bez utraty pól starych dokumentów.

Zobaczmy zapytanie powłoki MongoDB przy użyciu updateMany metoda:

db.student.updateMany(
    { 
        age: { 
            $lt: 20
         } 
    },
    { 
        $set:{ 
            "Review" : true 
        }
    }
);

Powyższe polecenie zwróci następujące dane wyjściowe:

{
    "acknowledged":true,
    "matchedCount":2,
    "modifiedCount":2
}

Tutaj matchedCount zawiera liczbę dopasowanych dokumentów, natomiast modifiedCount zawiera zmodyfikowany numer dokumentu.

Przyjrzyjmy się teraz kodowi sterownika Java za pomocą updateMany metoda:

UpdateResult updateResult = collection.updateMany(Filters.lt("age", 20), Updates.set("Review", true));

Tutaj wszystkie dokumenty z wikiem mniej niż 20 zostanie przefiltrowanych, a Recenzja pole zostanie ustawione na prawda .

5. Korzystanie z replaceOne Metoda

replaceOne metoda MongoDB zastępuje cały dokument. Jedna z wad replaceOne jest to, że wszystkie starsze pola zostaną zastąpione nowymi polami, a starsze pola również zostaną utracone:

db.student.replaceOne(
    { 
        "student_id": 8764
    },
    {
        "student_id": 8764,
        "student_name": "Paul Starc",
        "address": "Hostel 2",
        "age": 18,
        "roll_no":199406
    }
);

W takim przypadku otrzymamy następujące dane wyjściowe:

{
    "acknowledged":true,
    "matchedCount":1,
    "modifiedCount":1
}

Jeśli nie zostaną znalezione żadne dopasowania, operacja zwraca matchedCount jako 0:

{
    "acknowledged":true,
    "matchedCount":0,
    "modifiedCount":0
}

Napiszmy odpowiedni kod sterownika Java za pomocą replaceOne metoda:

Document replaceDocument = new Document();
replaceDocument
  .append("student_id", 8764)
  .append("student_name", "Paul Starc")
  .append("address", "Hostel 2")
  .append("age",18)
  .append("roll_no", 199406);
UpdateResult updateResult = collection.replaceOne(Filters.eq("student_id", 8764), replaceDocument);

W powyższym kodzie stworzyliśmy dokument, którym zostanie zastąpiony starszy dokument. Dokument z student_id 8764 zostanie zastąpione nowo utworzonym dokumentem.

6. Korzystanie z funkcji findOneAndReplace Metoda

znajdźOneAndReplace Metoda jest jedną z zaawansowanych metod aktualizacji dostarczanych przez MongoDB i zastępuje pierwszy dopasowany dokument na podstawie podanych kryteriów wyboru. Domyślnie ta metoda zwraca oryginalny dokument. Możemy użyć różnych opcji findOneAndReplace w razie potrzeby sortować i projektować dokumenty.

Krótko mówiąc, znajdźOneAndReplace zastępuje pierwszy pasujący dokument z kolekcji na podstawie zastosowanego filtra:

db.student.findOneAndReplace(
    { 
        "student_id" : { 
            $eq : 8764 
        }
    },
    { 
        "student_id" : 8764,
        "student_name" : "Paul Starc",
        "address": "Hostel 2",
        "age": 18,
        "roll_no":199406 
    },
    {
        returnNewDocument: false
    }
);

To zapytanie zwróci następujący dokument:

{
    "student_id":8764,
    "student_name":"Paul Starc",
    "address":"Hostel 1",
    "age":16,
    "roll_no":199406
}

Jeśli ustawimy returnNewDocument aby prawda , operacja zwróci zastąpiony dokument:

{
    "student_id":8764,
    "student_name":"Paul Starc",
    "address":"Hostel 2",
    "age":18,
    "roll_no":199406
}

Użyjmy teraz findOneAndReplace metoda wyświetlania student_id i wiek pola w zwróconym dokumencie:

db.student.findOneAndReplace(
    { 
        "student_id" : {
        $eq : 8764 
        } 
    },
    { 
        "student_id" : 8764, 
        "student_name" : "Paul Starc",
        "address": "Hostel 2",
        "age": 18,
        "roll_no":199406 
    },
    { 
        projection: { 
            "_id" : 0,
            "student_id":1,
            "age" : 1 
        } 
    }
);

Wynik powyższego zapytania będzie zawierał tylko przewidywane pola:

{
    "student_id":"8764",
    "age":16
}

Kod sterownika Java powyższego zapytania z różnymi opcjami findOneAndReplace:

Document replaceDocument = new Document();
replaceDocument
  .append("student_id", 8764)
  .append("student_name", "Paul Starc")
  .append("address", "Hostel 2")
  .append("age", 18)
  .append("roll_no", 199406);
Document sort = new Document("roll_no", 1);
Document projection = new Document("_id", 0).append("student_id", 1).append("address", 1);
Document resultDocument = collection.findOneAndReplace(
  Filters.eq("student_id", 8764), 
  replaceDocument,
  new FindOneAndReplaceOptions().upsert(true).sort(sort).projection(projection).returnDocument(ReturnDocument.AFTER));

W powyższym zapytaniu findOneAndReplace metoda najpierw posortuje dokumenty w kolejności rosnącej na podstawie roll_no, a nowo utworzony dokument zastępuje dokument student_id „8764”.

7. Korzystanie z findOneAndUpdate Metoda

findOneAndUpdate Metoda aktualizuje pierwszy pasujący dokument w kolekcji. Jeśli więcej niż jeden dokument spełnia kryteria wyboru, aktualizuje tylko pierwszy zgodny dokument. Kiedy aktualizujemy dokument, wartość _id pole pozostaje niezmienione:

db.student.findOneAndUpdate(
    { 
        "student_id" : 8764
    },
    { 
        $inc : { 
            "roll_no" : 5
        } 
    },
    { 
        sort: { 
            "roll_no" : 1 
        }, 
        projection: { 
            "_id" : 0,
            "student_id":1,
            "address" : 1
        }
    }
);

Wynik zapytania będzie zawierał tylko identyfikator studenta i adres starszego dokumentu:

{
    "student_id":8764,
    "address":"Hostel 1"
}

Kod sterownika Java powyższego zapytania, przy użyciu różnych opcji findOneAndUpdate wygląda następująco:

Document sort = new Document("roll_no", 1);
Document projection = new Document("_id", 0).append("student_id", 1).append("address", 1);
Document resultDocument = collection.findOneAndUpdate(
  Filters.eq("student_id", 8764),
  Updates.inc("roll_no", 5), 
  new FindOneAndUpdateOptions().sort(sort).projection(projection).returnDocument(ReturnDocument.BEFORE));

W takim przypadku findOneAndUpdate metoda najpierw posortuje dokument w kolejności rosnącej na podstawie roll_no . Powyższe zapytanie zwiększa roll_no o 5, a następnie zwraca identyfikator studenta i adres pola.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Symbol wieloznaczny MongoDB w kluczu zapytania

  2. Jak przekonwertować zestaw replik MongoDB na samodzielny serwer?

  3. Jak w MongoDB mapreduce spłaszczyć obiekt wartości?

  4. pobierz obiekt mongodb _id po upsert z php

  5. Jak porównać 2 kolekcje mongodb?