sql >> Databasteknik >  >> NoSQL >> MongoDB

Uppdatera flera fält i ett MongoDB-dokument

1. Översikt

MongoDB är en dokumentorienterad NoSQL-databas som är allmänt tillgänglig. Vi kan uppdatera dokumenten i en samling med olika metoder som uppdatering , ersätt och spara . För att ändra ett specifikt fält i dokumentet använder vi olika operatorer som $set , $inc, etc.

I den här självstudien lär vi oss att ändra de flera fälten i ett dokument med uppdateringen och ersätt fråga. I demonstrationssyfte kommer vi först att diskutera mongo-skalfrågan och sedan dess motsvarande implementering i Java.

Låt oss nu titta på de olika metoderna för att uppnå syftet.

2. Shell-fråga för att uppdatera olika fält

Innan vi börjar, låt oss först skapa en ny databas, baeldung , och en exempelsamling, anställd . Vi kommer att använda den här samlingen i alla exempel:

use baeldung;
db.createCollection(employee);

Låt oss nu lägga till några dokument i den här samlingen med hjälp av insertMany fråga:

db.employee.insertMany([
    {
        "employee_id": 794875,
        "employee_name": "David Smith",
        "job": "Sales Representative",
        "department_id": 2,
        "salary": 20000,
        "hire_date": NumberLong("1643969311817")
    },
    {
        "employee_id": 794876,
        "employee_name": "Joe Butler",
        "job": "Sales Manager",
        "department_id": 3,
        "salary": 30000,
        "hire_date": NumberLong("1645338658000")
    }
]);

Som ett resultat kommer vi att få en JSON med ObjectId för båda dokumenten som visas nedan:

{
    "acknowledged": true,
    "insertedIds": [
        ObjectId("6211e034b76b996845f3193d"),
        ObjectId("6211e034b76b996845f3193e")
        ]
}

Hittills har vi satt upp den miljö som krävs. Låt oss nu uppdatera dokumenten som vi just infogade.

2.1. Uppdatera flera fält i ett enda dokument

Vi kan använda $set och $inc operatörer för att uppdatera vilket fält som helst i MongoDB. $set operatören kommer att ställa in det nyligen angivna värdet medan $inc operatören kommer att öka värdet med ett angivet värde.

Låt oss först titta på MongoDB-frågan för att uppdatera två fält i personalsamlingen med hjälp av $set operatör:

db.employee.updateOne(
    {
        "employee_id": 794875,
        "employee_name": "David Smith"
    },
    {
        $set:{
            department_id:3,
            job:"Sales Manager"
        }
    }
);

I ovanstående fråga, employee_id och employee_name fältet används för att filtrera dokumentet och $set operatorn används för att uppdatera jobbet och department_id fält.

Vi kan också använda $set och $inc operatörer tillsammans i en enda uppdateringsfråga:

db.employee.updateOne(
    {
        "employee_id": 794875
    },
    {
        $inc: {
            department_id: 1
        },
        $set: {
            job: "Sales Manager"
        }
    }
);

Detta kommer att uppdatera jobbet fältet till försäljningschef och öka department_id senast 1.

2.2. Uppdatera flera fält för flera dokument

Dessutom kan vi också uppdatera flera fält för mer än ett dokument i MongoDB. Vi behöver helt enkelt inkludera alternativet multi:true för att ändra alla dokument som matchar filterfrågans kriterier:

db.employee.update(
    {
        "job": "Sales Representative"
    },
    {
        $inc: { 
            salary: 10000
        }, 
        $set: { 
            department_id: 5
        }
    },
    {
        multi: true 
    }
);

Alternativt får vi samma resultat med updateMany fråga:

db.employee.updateMany(
    {
        "job": "Sales Representative"
    },
    {
        $inc: {
            salary: 10000
        },
        $set: {
            department_id: 5
        }
    }
);

I ovanstående fråga använde vi updateMany metod för att uppdatera mer än 1 dokument i samlingen.

2.3. Vanligt problem vid uppdatering av flera fält

Hittills har vi lärt oss att uppdatera flera fält med hjälp av uppdateringsfrågan genom att tillhandahålla två olika operatörer eller använda en enda operatör på flera fält.

Om vi ​​nu använder en operator flera gånger med olika fält i en enda fråga, kommer MongoDB bara att uppdatera den sista satsen i uppdateringsfrågan och ignorera resten:

db.employee.updateMany(
    {
        "employee_id": 794875
    },
    {
        $set: {
            department_id: 3
        },
        $set: {
            job:"Sales Manager"
        }
    }
);

Ovanstående fråga kommer att returnera en liknande utdata till denna:

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

I det här fallet är det enda jobbet kommer att uppdateras till "Säljchef". department_id värde kommer inte att uppdateras till 3.

3. Uppdatera fält med Java-drivrutin

Hittills har vi diskuterat de råa MongoDB-frågorna. Låt oss nu utföra samma operationer med Java. MongoDB Java-drivrutin stöder två klasser för att representera ett MongoDB-dokument, com.mongodb.BasicDBObject och org.bson.Document. Vi kommer att undersöka båda metoderna för att uppdatera fält i ett dokument.

Innan vi fortsätter, låt oss först ansluta till anställda samling inne i baeldung DB:

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

Här har vi antagit att MongoDB körs lokalt vid standardporten 27017.

3.1. Använder DBObject

För att skapa dokumentet i MongoDB använder vi com.mongodb. DBObject-gränssnittet och dess implementeringsklass com.mongodb.BasicDBObject .

Implementeringen av DBObject baseras på nyckel-värdepar. BasicDBObject ärvs från LinkedHashMap klass som finns i util paket.

Låt oss nu använda com.mongodb.BasicDBObject för att utföra uppdateringen på flera fält:

BasicDBObject searchQuery = new BasicDBObject("employee_id", 794875);
BasicDBObject updateFields = new BasicDBObject();
updateFields.append("department_id", 3);
updateFields.append("job", "Sales Manager");
BasicDBObject setQuery = new BasicDBObject();
setQuery.append("$set", updateFields);
UpdateResult updateResult = collection.updateMany(searchQuery, setQuery);

Här skapade vi först en filterfråga på basis av employee_id. Denna operation returnerar en uppsättning dokument. Vidare har vi uppdaterat värdet för department_id och jobb enligt den inställda frågan.

3.2. Använder bson Dokument

Vi kan utföra alla MongoDB-operationer med bson dokumentera. För det behöver vi först samlingsobjektet och sedan utföra uppdateringsoperationen med updateMany metod med filtret och ställ funktioner.

UpdateResult updateQueryResult = collection.updateMany(Filters.eq("employee_id", 794875),
Updates.combine(Updates.set("department_id", 3), Updates.set("job", "Sales Manager")));

Här skickar vi ett frågefilter till updateMany metod. eq filter matchar employee_id med den exakt matchande texten "794875". Sedan uppdaterar vi department_id och jobbet med uppsättningen operatör.

4. Använda Replace Query

Den naiva metoden för att uppdatera flera fält i ett dokument är att ersätta det med ett nytt dokument som har uppdaterade värden.

Till exempel om vi vill ersätta ett dokument med anställd_id 794875, kan vi köra följande fråga:

db.employee.replaceOne(
    {
        "employee_id": 794875
    },
    {
        "employee_id": 794875,
        "employee_name": "David Smith",
        "job": "Sales Manager",
        "department_id": 3,
        "salary": 30000,
        "hire_date": NumberLong("1643969311817")
    }
);

Ovanstående kommando kommer att skriva ut en bekräftelse JSON i utdata:

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

Här, employee_id fältet används för att filtrera dokumentet. Det andra argumentet i uppdateringsfrågan anger dokumentet från vilket det befintliga dokumentet kommer att ersättas.

I ovanstående fråga utför vi replaceOne , därför kommer det bara att ersätta ett enda dokument med det filtret. Alternativt, om vi vill ersätta alla dokument med den filterfrågan, måste vi använda updateMany metod.


  1. fråga efter en samling utan att skicka schemat i mongoose

  2. Django Selleri får uppgiftsräkning

  3. Tryck till Laravel-kö från utanför Laravel (NodeJS)

  4. Lagra flera versioner av data i Redis cache