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

Operacje wypychania i ustawiania w tej samej aktualizacji MongoDB

1. Przegląd

$wypychanie to operator aktualizacji w MongoDB, który dodaje wartość do tablicy. Natomiast zestaw $ operator służy do aktualizowania wartości istniejącego pola w dokumencie.

W tym krótkim samouczku przedstawimy, jak wykonać $push i zestaw $ operacje razem w jednym zapytaniu aktualizacyjnym.

2. Inicjalizacja bazy danych

Zanim przejdziemy dalej, aby wykonać wiele operacji aktualizacji, najpierw musimy skonfigurować bazę danych baeldung i próbki kolekcji znaki :

use baeldung;
db.createCollection(marks);

Wstawmy kilka dokumentów do kolekcji marks za pomocą insertMany metoda MongoDB:

db.marks.insertMany([
    {
        "studentId": 1023,
        "studentName":"James Broad",
        "joiningYear":"2018",
        "totalMarks":100,
        "subjectDetails":[
            {
                "subjectId":123,
                "subjectName":"Operating Systems Concepts",
                "marks":40
            },
            {
                "subjectId":124,
                "subjectName":"Numerical Analysis",
                "marks":60
            }
        ]
    },
    {
        "studentId": 1024,
        "studentName":"Chris Overton",
        "joiningYear":"2018",
        "totalMarks":110,
        "subjectDetails":[
            {
                "subjectId":123,
                "subjectName":"Operating Systems Concepts",
                "marks":50
            },
            {
                "subjectId":124,
                "subjectName":"Numerical Analysis",
                "marks":60
            }
        ]
    }
]);

Po pomyślnym wstawieniu powyższe zapytanie zwróci następującą odpowiedź:

{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("622300cc85e943405d04b567"),
        ObjectId("622300cc85e943405d04b568")
    ]
}

Jak dotąd z powodzeniem wstawiliśmy kilka przykładowych dokumentów do kolekcji marks .

3. Zrozumienie problemu

Aby zrozumieć problem, najpierw zrozummy dokument, który właśnie wstawiliśmy. Zawiera szczegóły ucznia i uzyskane przez niego oceny z różnych przedmiotów. totalMarks to suma ocen uzyskanych z różnych przedmiotów.

Rozważmy sytuację, w której chcemy dodać nowy temat w subjectDetails szyk. Aby dane były również spójne, musimy zaktualizować totalMarks również w polu.

W MongoDB najpierw dodamy nowy temat do tablicy za pomocą przycisku $push operator. Następnie ustawimy totalMarks pole do określonej wartości za pomocą $set operatora.

Obie te operacje można wykonać indywidualnie za pomocą przycisku $push i zestaw $ operatora, odpowiednio. Ale możemy napisać zapytanie MongoDB, aby wykonać obie operacje razem.

4. Korzystanie z zapytania powłoki MongoDB

W MongoDB możemy aktualizować wiele pól dokumentu przy użyciu różnych operatorów aktualizacji. Tutaj użyjemy obu opcji $push i zestaw $ operatorów razem w updateOne zapytanie.

Przyjrzyjmy się przykładowi zawierającemu zarówno $push i zestaw $ operatorzy razem:

db.marks.updateOne(
    {
        "studentId": 1023
    },
    {
        $set: {
            totalMarks: 170
        },
        $push: {
            "subjectDetails":{
                "subjectId": 126,
                "subjectName": "Java Programming",
                "marks": 70
            }
        }
    }
);

Tutaj, w powyższym zapytaniu, dodaliśmy zapytanie filtrujące na podstawie studentId. Po otrzymaniu przefiltrowanego dokumentu aktualizujemy totalMarks za pomocą operatora $set. Oprócz tego wstawiamy nowe dane podmiotu w subjectDetails tablicę za pomocą $push operatora.

W rezultacie powyższe zapytanie zwróci następujący wynik:

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

Tutaj matchedCount zawiera liczbę dokumentów pasującą do filtra, podczas gdy modifiedCount zawiera liczbę zmodyfikowanych dokumentów.

5. Kod sterownika Java

Do tej pory omówiliśmy zapytanie powłoki mongo, aby użyć $push i zestaw $ operator razem. Tutaj nauczymy się zaimplementować to samo za pomocą kodu sterownika Java.

Zanim przejdziemy dalej, najpierw połączmy się z bazą danych i wymaganą kolekcją:

MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("marks");

Tutaj łączymy się z MongoDB, które działa na domyślnym porcie portu 27017 na hoście lokalnym.

Przyjrzyjmy się teraz kodowi sterownika Java:

Document subjectData = new Document()
  .append("subjectId", 126)
  .append("subjectName", "Java Programming")
  .append("marks", 70); 
UpdateResult updateQueryResult = collection.updateOne(Filters.eq("studentId", 1023), 
  Updates.combine(Updates.set("totalMarks", 170), 
  Updates.push("subjectDetails", subjectData)));

W tym fragmencie kodu użyliśmy updateOne metoda, która aktualizuje tylko jeden dokument na podstawie zastosowanego filtru studentId 1023. Następnie użyliśmy Updates.combine do wykonywania wielu operacji w jednym wywołaniu. Pole totalMarks zostanie zaktualizowany do 170, a nowy dokument subjectData zostanie przeniesiony do pola tablicy „subjectDetails” .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Pobierz dane z kolekcji b spoza kolekcji a w zapytaniu powłoki MongoDB

  2. Jak znaleźć dokumenty spełniające wiele kryteriów

  3. Prawidłowe zamykanie połączenia z bazą danych MongoDB ze sterownika C# 2.1?

  4. Czy MongoDB może używać indeksu podczas sprawdzania istnienia pola z operatorem $exists?

  5. Pierwszy hosting DBaaS MongoDB obsługujący platformę Azure dla sektora publicznego