sql >> Databáze >  >> NoSQL >> MongoDB

Push and Set Operations v Same MongoDB Update

1. Přehled

$push je aktualizační operátor v MongoDB, který přidává hodnotu do pole. Naproti tomu $set operátor se používá k aktualizaci hodnoty existujícího pole v dokumentu.

V tomto krátkém tutoriálu vám představíme, jak provést $push a $set operace společně v jediném aktualizačním dotazu.

2. Inicializace databáze

Než se pustíme do provádění několika aktualizačních operací, musíme nejprve nastavit databázi baeldung a značky kolekce vzorků :

use baeldung;
db.createCollection(marks);

Vložme do sbírky značky pár dokumentů 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 úspěšném vložení vrátí výše uvedený dotaz následující odpověď:

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

Do sbírky značek jsme zatím úspěšně vložili pár vzorových dokumentů .

3. Pochopení problému

Abychom porozuměli problému, pojďme nejprve porozumět dokumentu, který jsme právě vložili. Zahrnuje podrobnosti o studentech a známky, které získali v různých předmětech. totalMarks je součet známek získaných v různých předmětech.

Uvažujme situaci, kdy si přejeme přidat nový předmět do podrobnosti předmětu pole. Aby byla data konzistentní, musíme aktualizovat totalMarks pole také.

V MongoDB nejprve přidáme nový předmět do pole pomocí $push operátor. Poté nastavíme totalMarks pole na konkrétní hodnotu pomocí $set operátor.

Obě tyto operace lze provést jednotlivě pomocí $push a $set provozovatel, resp. Ale můžeme napsat dotaz MongoDB, abychom provedli obě operace společně.

4. Použití MongoDB Shell Query

V MongoDB můžeme aktualizovat více polí dokumentu pomocí různých aktualizačních operátorů. Zde použijeme obě $push a $set operátory společně v updateOne dotaz.

Podívejme se na příklad obsahující obojí $push a $set operátory společně:

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

Zde jsme do výše uvedeného dotazu přidali filtrovací dotaz založený na studentId. Jakmile získáme filtrovaný dokument, aktualizujeme totalMarks pomocí operátoru $set. Kromě toho vkládáme nová data subjektu do subjectDetails pole pomocí $push operátor.

Výsledkem je, že výše uvedený dotaz vrátí následující výstup:

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

Zde je matchedCount obsahuje počet dokumentů, které odpovídaly filtru, zatímco modifiedCount obsahuje počet upravených dokumentů.

5. Kód ovladače Java

Doposud jsme diskutovali o dotazu mongo shell pro použití $push a $set operátor společně. Zde se naučíme implementovat totéž pomocí kódu ovladače Java.

Než pokročíme vpřed, pojďme se nejprve připojit k DB a požadované kolekci:

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

Zde se připojujeme k MongoDB, který běží na výchozím portu 27017 na localhost.

Nyní se podíváme na kód ovladače 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)));

V tomto fragmentu kódu jsme použili updateOne metoda, která aktualizuje pouze jeden dokument na základě použitého filtru studentId 1023. Poté jsme použili Updates.combine provádět více operací v jednom hovoru. Pole totalMarks bude aktualizován na 170 a nový dokument subjectData bude přesunuto do pole pole “subjectDetails“ .


  1. Jak implementovat MongoDB vnořený $elemMatch Query v C#

  2. Jak mohu nastavit MongoDB na serveru Node.js pomocí node-mongodb-native v prostředí EC2?

  3. Dynamické atributy s Rails a Mongoid

  4. Co je práce Map Only v Hadoopu?