sql >> Databasteknik >  >> NoSQL >> MongoDB

Uppdatera dokument i MongoDB

1. Översikt

MongoDB är en plattformsoberoende, dokumentorienterad NoSQL-databas med öppen källkod, skriven i C++. Dessutom ger MongoDB hög prestanda, hög tillgänglighet och automatisk skalning.

För att uppdatera dokumenten i MongoDB kan vi använda olika metoder som updateOne , findOneAndUpdate, etc. Dessutom tillhandahåller MongoDB olika operatörer för uppdateringsmetoderna.

I den här handledningen kommer vi att diskutera olika metoder för att utföra uppdateringsoperationer i MongoDB. För varje tillvägagångssätt kommer vi först att diskutera mongo-skalfrågan och sedan dess implementering i Java.

2. Databasinställningar

Innan vi går vidare till uppdateringsfrågorna, låt oss först skapa en databas, baeldung , och en provsamling, student:

use baeldung;
db.createCollection(student);

Som en illustration, låt oss lägga till några dokument i samlingen student med hjälp av insertMany fråga:

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

Vid lyckad infogning får vi en JSON med acknowledged:true :

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

Låt oss nu dyka djupt in i olika sätt att uppdatera dokumenten i MongoDB.

3. Använda updateOne Metod

En uppdateringsoperation i MongoDB kan göras genom att lägga till ett nytt fält, ta bort ett fält eller uppdatera ett befintligt fält. Den updateOne  metod uppdaterar ett enstaka dokument i en samling baserat på det tillämpade frågefiltret. Den hittar först dokumentet som matchar filtret och uppdaterar sedan de angivna fälten.

Dessutom kan vi använda olika operatorer som $set , $unset , $inc , etc., med uppdateringsmetoden.

För att demonstrera, låt oss titta på frågan för att uppdatera ett enda dokument i en samling:

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

Vi får en utdata som liknar den som visas nedan:

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

Låt oss nu kolla in Java-drivrutinskoden för ovanstående updateOne fråga:

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

Här har vi för det första använt studentnamn fältet för att filtrera dokumenten. Sedan uppdaterar vi adressen till dokumentet med student_name "Paul Starc".

4. Använda updateMany Metod

updateMany metod uppdaterar alla dokument i MongoDB-samlingar som matchar det givna filtret. En av fördelarna med att använda updateMany är att vi kan uppdatera flera dokument utan att förlora fälten i gamla dokument.

Låt oss se MongoDB-skalfrågan med updateMany metod:

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

Kommandot ovan returnerar följande utdata:

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

Här, matchedCount innehåller antalet matchade dokument, medan modifiedCount innehåller det ändrade dokumentnumret.

Låt oss nu titta på Java-drivrutinskoden med hjälp av updateMany metod:

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

Här, alla dokument med ålder färre än 20 kommer att filtreras, och Recensionen fältet sätts till true .

5. Använda replaceOne Metod

replaceOne metod för MongoDB ersätter hela dokumentet. En av nackdelarna med replaceOne är att alla äldre fält kommer att ersättas av de nya fälten, och de äldre fälten kommer också att gå förlorade:

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

I det här fallet får vi följande utdata:

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

Om inga matchningar hittas returnerar operationen matchedCount som 0:

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

Låt oss skriva motsvarande Java-drivrutinskod med replaceOne metod:

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

I koden ovan har vi skapat ett dokument som det äldre dokumentet kommer att ersättas med. Dokumentet med student_id 8764 kommer att ersättas med det nyskapade dokumentet.

6. Använda findOneAndReplace Metod

findOneAndReplace metod är en av de avancerade uppdateringsmetoderna som tillhandahålls av MongoDB, och den ersätter det första matchade dokumentet baserat på de givna urvalskriterierna. Som standard returnerar den här metoden originaldokumentet. Vi kan använda olika alternativ för findOneAndReplace att sortera och projektera dokument vid behov.

Kort sagt, findOneAndReplace ersätter det första matchande dokumentet i samlingen på basis av det tillämpade filtret:

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

Denna fråga returnerar följande dokument:

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

Om vi ​​ställer in returnNewDocument till sant , skulle operationen då returnera det ersatta dokumentet istället:

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

Låt oss nu använda findOneAndReplace metod för att projicera student_id och ålder fält i det returnerade dokumentet:

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

Utdata från ovanstående fråga kommer endast att innehålla de projicerade fälten:

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

Java-drivrutinskoden för ovanstående fråga med olika alternativ för 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));

I ovanstående fråga, findOneAndReplace metod kommer först att sortera dokumenten i stigande ordning baserat på roll_no, och det nyskapade dokumentet ersätter dokumentet med student_id "8764".

7. Använda findOneAndUpdate Metod

findOneAndUpdate metod uppdaterar det första matchade dokumentet i samlingen. Om mer än ett dokument matchar urvalskriterierna uppdateras endast det första matchade dokumentet. När vi uppdaterar dokumentet kommer värdet på _id fältet förblir oförändrat:

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

Utdata från frågan kommer bara att innehålla studentId och adress av det äldre dokumentet:

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

Java-drivrutinskoden för ovanstående fråga, med hjälp av olika alternativ för findOneAndUpdate är som följer:

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

I det här fallet, findOneAndUpdate metod kommer först att sortera dokumentet i stigande ordning baserat på roll_no . Ovanstående fråga ökar roll_no  med 5 och returnerar sedan student_id och adress fält.


  1. Mungos befolkar kapslad array

  2. När ska jag använda en NoSQL-databas istället för en relationsdatabas? Är det okej att använda båda på samma sida?

  3. Skapa nycklar i bulk i Redis - ServiceStack C#

  4. HBase och Hive – Bättre tillsammans