sql >> Database >  >> NoSQL >> MongoDB

Documenten bijwerken in MongoDB

1. Overzicht

MongoDB is een platformonafhankelijke, documentgeoriënteerde, open-source NoSQL-database, geschreven in C++. Bovendien biedt MongoDB hoge prestaties, hoge beschikbaarheid en automatisch schalen.

Om de documenten in MongoDB bij te werken, kunnen we verschillende methoden gebruiken, zoals updateOne , findOneAndUpdate, enz. Verder biedt MongoDB verschillende operators voor de updatemethoden.

In deze zelfstudie bespreken we verschillende benaderingen om updatebewerkingen in MongoDB uit te voeren. Voor elke benadering bespreken we eerst de mongo-shellquery en vervolgens de implementatie ervan in Java.

2. Database instellen

Voordat we verder gaan met de update-query's, laten we eerst een database maken, baeldung , en een voorbeeldverzameling, student:

use baeldung;
db.createCollection(student);

Laten we ter illustratie een paar documenten toevoegen aan de verzameling student met behulp van de insertMany vraag:

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

Na succesvolle invoeging krijgen we een JSON met acknowledged:true :

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

Laten we nu diep ingaan op verschillende manieren om de documenten in MongoDB bij te werken.

3. De updateOne . gebruiken Methode

Een update-bewerking in MongoDB kan worden gedaan door een nieuw veld toe te voegen, een veld te verwijderen of een bestaand veld bij te werken. De updateOne  methode werkt een enkel document in een verzameling bij op basis van het toegepaste queryfilter. Het vindt eerst het document dat overeenkomt met het filter en werkt vervolgens de opgegeven velden bij.

Bovendien kunnen we verschillende operatoren gebruiken, zoals $set , $unset , $inc , enz., met de update-methode.

Laten we ter demonstratie eens kijken naar de vraag om een ​​enkel document van een verzameling bij te werken:

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

We krijgen een uitvoer die lijkt op die hieronder:

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

Laten we nu eens kijken naar de Java-stuurprogrammacode van de bovenstaande updateOne vraag:

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

Hier hebben we eerst de student_name . gebruikt veld om de documenten te filteren. Daarna werken we het adres van het document bij met student_name "Paul Starc".

4. De updateMany . gebruiken Methode

De updateMany methode werkt alle documenten in MongoDB-verzamelingen bij die overeenkomen met het opgegeven filter. Een van de voordelen van het gebruik van de updateMany is dat we meerdere documenten kunnen bijwerken zonder de velden van oude documenten te verliezen.

Laten we eens kijken naar de MongoDB-shellquery met updateMany methode:

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

De bovenstaande opdracht geeft de volgende uitvoer:

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

Hier, matchedCount bevat het aantal overeenkomende documenten, terwijl modifiedCount bevat het gewijzigde documentnummer.

Laten we nu kijken naar de Java-stuurprogrammacode met behulp van de updateMany methode:

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

Hier alle documenten met leeftijd minder dan 20 worden gefilterd en de Review veld wordt ingesteld op true .

5. De replaceOne . gebruiken Methode

De replaceOne methode van MongoDB vervangt het hele document. Een van de nadelen van de replaceOne is dat alle oudere velden zullen worden vervangen door de nieuwe velden, en de oudere velden zullen ook verloren gaan:

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

In dit geval krijgen we de volgende uitvoer:

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

Als er geen overeenkomsten worden gevonden, retourneert de bewerking de matchedCount als 0:

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

Laten we de corresponderende Java-stuurprogrammacode schrijven met behulp van de replaceOne methode:

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

In de bovenstaande code hebben we een document gemaakt waardoor het oudere document wordt vervangen. Het document met student_id 8764 wordt vervangen door het nieuw gemaakte document.

6. De findOneAndReplace . gebruiken Methode

De findOneAndReplace methode is een van de geavanceerde updatemethoden die door MongoDB worden aangeboden en vervangt het eerste overeenkomende document op basis van de opgegeven selectiecriteria. Standaard retourneert deze methode het originele document. We kunnen verschillende opties van de findOneAndReplace . gebruiken om indien nodig documenten te sorteren en te projecteren.

Kortom, findOneAndReplace vervangt het eerste overeenkomende document van de collectie op basis van het toegepaste filter:

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

Deze zoekopdracht levert het volgende document op:

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

Als we returnNewDocument . instellen naar waar , zou de bewerking in plaats daarvan het vervangen document retourneren:

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

Laten we nu de findOneAndReplace . gebruiken methode om de student_id . te projecteren en leeftijd velden in het geretourneerde document:

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

De uitvoer van de bovenstaande zoekopdracht bevat alleen de geprojecteerde velden:

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

De Java-stuurprogrammacode van de bovenstaande query met verschillende opties van de 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));

In de bovenstaande zoekopdracht is de findOneAndReplace methode sorteert de documenten eerst in oplopende volgorde op basis van roll_no, en het nieuw gemaakte document vervangt het document door student_id "8764".

7. De findOneAndUpdate . gebruiken Methode

De findOneAndUpdate methode werkt het eerste overeenkomende document in de verzameling bij. Als meer dan één document overeenkomt met de selectiecriteria, wordt alleen het eerste overeenkomende document bijgewerkt. Wanneer we het document bijwerken, wordt de waarde van de _id veld blijft ongewijzigd:

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

De uitvoer van de query bevat alleen de studentId en adres van het oudere document:

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

De Java-stuurprogrammacode van de bovenstaande zoekopdracht, met behulp van verschillende opties van de findOneAndUpdate is als volgt:

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

In dit geval is de findOneAndUpdate methode zal het document eerst in oplopende volgorde sorteren op basis van roll_no . De bovenstaande zoekopdracht verhoogt de roll_no  met 5 en retourneert vervolgens de student_id en adres velden.


  1. Wat is een Map Only-baan in Hadoop?

  2. Redis - Verbinding maken met externe server

  3. Hoe has_many te implementeren:via relaties met Mongoid en mongodb?

  4. Hoe ClusterControl automatisch databaseherstel en failover uitvoert