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

Aktualizujte dokumenty v MongoDB

1. Přehled

MongoDB je multiplatformní, dokumentově orientovaná, open source databáze NoSQL napsaná v C++. MongoDB navíc poskytuje vysoký výkon, vysokou dostupnost a automatické škálování.

K aktualizaci dokumentů v MongoDB můžeme použít různé metody jako updateOne , findOneAndUpdate, atd. Dále MongoDB poskytuje různé operátory pro metody aktualizace.

V tomto tutoriálu probereme různé přístupy k provádění operací aktualizace v MongoDB. U každého přístupu nejprve probereme dotaz mongo shell a poté jeho implementaci v Javě.

2. Nastavení databáze

Než přejdeme k aktualizačním dotazům, nejprve vytvořte databázi baeldung a ukázková sbírka student:

use baeldung;
db.createCollection(student);

Pro ilustraci přidáme několik dokumentů do sbírky student pomocí insertMany dotaz:

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 úspěšném vložení získáme JSON s acknowledged:true :

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

Pojďme se nyní ponořit hluboko do různých způsobů aktualizace dokumentů v MongoDB.

3. Pomocí updateOne Metoda

Operaci aktualizace v MongoDB lze provést přidáním nového pole, odebráním pole nebo aktualizací existujícího pole. The updateOne  metoda aktualizuje jeden dokument v kolekci na základě použitého filtru dotazu. Nejprve najde dokument, který odpovídá filtru, a poté aktualizuje zadaná pole.

Kromě toho můžeme použít různé operátory, například $set , $unset , $inc , atd., pomocí metody aktualizace.

Abychom to demonstrovali, podívejme se na dotaz na aktualizaci jednoho dokumentu kolekce:

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

Získáme výstup podobný tomu, který je zobrazen níže:

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

Pojďme se nyní podívat na kód Java ovladače výše uvedeného updateOne dotaz:

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

Zde jsme nejprve použili jméno_studenta pole pro filtrování dokumentů. Poté aktualizujeme adresu dokumentu pomocí jméno_studenta "Paul Starc".

4. Pomocí updateMany Metoda

updateMany metoda aktualizuje všechny dokumenty v kolekcích MongoDB, které odpovídají danému filtru. Jedna z výhod používání updateMany je, že můžeme aktualizovat více dokumentů, aniž bychom ztratili pole starých dokumentů.

Podívejme se na dotaz shellu MongoDB pomocí updateMany metoda:

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

Výše uvedený příkaz vrátí následující výstup:

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

Zde matchedCount obsahuje počet odpovídajících dokumentů, zatímco modifiedCount obsahuje číslo upraveného dokumentu.

Nyní se podíváme na kód ovladače Java pomocí updateMany metoda:

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

Zde jsou všechny dokumenty s stáří bude filtrováno méně než 20 a Recenze pole bude nastaveno na true .

5. Pomocí replaceOne Metoda

replaceOne metoda MongoDB nahradí celý dokument. Jedna z nevýhod replaceOne je, že všechna starší pole budou nahrazena novými poli a starší pole budou také ztracena:

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

V tomto případě dostaneme následující výstup:

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

Pokud nejsou nalezeny žádné shody, operace vrátí matchedCount jako 0:

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

Pojďme napsat odpovídající kód ovladače Java 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);

Ve výše uvedeném kódu jsme vytvořili dokument, kterým bude starší dokument nahrazen. Dokument s id_studenta 8764 bude nahrazeno nově vytvořeným dokumentem.

6. Pomocí findOneAndReplace Metoda

findOneAndReplace metoda je jednou z pokročilých metod aktualizace poskytovaných MongoDB a nahrazuje první odpovídající dokument na základě daných kritérií výběru. Ve výchozím nastavení tato metoda vrací původní dokument. Můžeme použít různé možnosti findOneAndReplace v případě potřeby dokumenty třídit a projektovat.

Stručně řečeno, findOneAndReplace nahradí první odpovídající dokument kolekce na základě použitého filtru:

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

Tento dotaz vrátí následující dokument:

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

Pokud nastavíme returnNewDocument na pravdu , operace by pak místo toho vrátila nahrazený dokument:

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

Nyní použijeme findOneAndReplace metoda k promítnutí id_studenta a věk pole ve vráceném dokumentu:

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 
        } 
    }
);

Výstup výše uvedeného dotazu bude obsahovat pouze projektovaná pole:

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

Kód ovladače Java z výše uvedeného dotazu s různými možnostmi 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));

Ve výše uvedeném dotazu findOneAndReplace metoda nejprve seřadí dokumenty ve vzestupném pořadí na základě roll_no, a nově vytvořený dokument nahradí dokument id_studenta „8764“.

7. Pomocí findOneAndUpdate Metoda

findOneAndUpdate metoda aktualizuje první odpovídající dokument v kolekci. Pokud kritériím výběru odpovídá více než jeden dokument, aktualizuje se pouze první odpovídající dokument. Když dokument aktualizujeme, hodnota _id pole zůstane nezměněno:

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

Výstup dotazu bude obsahovat pouze studentId a adresa staršího dokumentu:

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

Kód ovladače Java z výše uvedeného dotazu pomocí různých možností findOneAndUpdate je následující:

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

V tomto případě findOneAndUpdate metoda nejprve seřadí dokument ve vzestupném pořadí na základě roll_no . Výše uvedený dotaz zvyšuje hodnotu roll_no  o 5 a poté vrátí id_studenta a adresa pole.


  1. Jak správně zvládnout migraci schématu mongoose?

  2. Jak používat sadd s více prvky v Redis pomocí Python API?

  3. Způsoby implementace verzování dat v MongoDB

  4. Meteor bez monga