MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mettre à jour plusieurs champs dans un document MongoDB

1. Présentation

MongoDB est une base de données NoSQL orientée document accessible au public. Nous pouvons mettre à jour les documents d'une collection en utilisant diverses méthodes comme update , remplacer et enregistrer . Afin de modifier un champ spécifique du document, nous utiliserons différents opérateurs comme $set , $inc, etc.

Dans ce tutoriel, nous allons apprendre à modifier les multiples champs d'un document à l'aide de la mise à jour et le remplacer requête. À des fins de démonstration, nous allons d'abord discuter de la requête shell mongo, puis de son implémentation correspondante en Java.

Examinons maintenant les différentes méthodes pour atteindre l'objectif.

2. Requête Shell pour mettre à jour différents champs

Avant de commencer, créons d'abord une nouvelle base de données, baeldung , et une collection d'échantillons, employé . Nous utiliserons cette collection dans tous les exemples :

use baeldung;
db.createCollection(employee);

Ajoutons maintenant quelques documents à cette collection en utilisant insertMany requête :

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

En conséquence, nous obtiendrons un JSON avec ObjectId pour les deux documents, comme indiqué ci-dessous :

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

Jusqu'à présent, nous avons mis en place l'environnement requis. Mettons maintenant à jour les documents que nous venons d'insérer.

2.1. Mettre à jour plusieurs champs d'un seul document

Nous pouvons utiliser $set et $inc opérateurs pour mettre à jour n'importe quel champ dans MongoDB. Le ensemble de $ l'opérateur définira la valeur nouvellement spécifiée tandis que le $inc l'opérateur augmentera la valeur d'une valeur spécifiée.

Examinons d'abord la requête MongoDB pour mettre à jour deux champs de la collection d'employés en utilisant le $set opérateur :

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

Dans la requête ci-dessus, le employee_id et employee_name champ est utilisé pour filtrer le document et le $set l'opérateur est utilisé pour mettre à jour le travail et department_id champs.

Nous pouvons également utiliser le $set et $inc opérateurs ensemble dans une seule requête de mise à jour :

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

Cela mettra à jour le travail champ au directeur des ventes et augmentez le department_id par 1.

2.2. Mettre à jour plusieurs champs de plusieurs documents

De plus, nous pouvons également mettre à jour plusieurs champs de plusieurs documents dans MongoDB. Nous devons simplement inclure l'option multi:true pour modifier tous les documents qui correspondent aux critères de requête du filtre :

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

Alternativement, nous obtiendrons les mêmes résultats en utilisant le updateMany requête :

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

Dans la requête ci-dessus, nous avons utilisé le updateMany méthode pour mettre à jour plus d'un document de la collection.

2.3. Problème courant lors de la mise à jour de plusieurs champs

Jusqu'à présent, nous avons appris à mettre à jour plusieurs champs à l'aide de la requête de mise à jour en fournissant deux opérateurs différents ou en utilisant un seul opérateur sur plusieurs champs.

Maintenant, si nous utilisons plusieurs fois un opérateur avec différents champs dans une seule requête, MongoDB ne mettra à jour que la dernière instruction de la requête de mise à jour et ignorez le reste :

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

La requête ci-dessus renverra une sortie similaire à celle-ci :

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

Dans ce cas, le seul emploi sera mis à jour en "Sales Manager". Le department_id la valeur ne sera pas mise à jour à 3.

3. Mettre à jour les champs avec le pilote Java

Jusqu'à présent, nous avons discuté des requêtes brutes MongoDB. Effectuons maintenant les mêmes opérations en utilisant Java. Le pilote Java MongoDB prend en charge deux classes pour représenter un document MongoDB, com.mongodb.BasicDBObject et org.bson.Document. Nous examinerons les deux méthodes pour mettre à jour les champs d'un document.

Avant de continuer, commençons par nous connecter à l'employé collection à l'intérieur du baeldung BD :

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

Ici, nous avons supposé que MongoDB s'exécute localement sur le port par défaut de 27017.

3.1. Utilisation de DBObject

Afin de créer le document dans MongoDB, nous utiliserons le com.mongodb. Interface DBObject et sa classe d'implémentation com.mongodb.BasicDBObject .

L'implémentation de DBObject est basé sur des paires clé-valeur. Le BasicDBObject est hérité du LinkedHashMap classe qui est dans l'util paquet.

Utilisons maintenant le com.mongodb.BasicDBObject pour effectuer l'opération de mise à jour sur plusieurs champs :

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

Ici, tout d'abord, nous avons créé une requête de filtre sur la base de employee_id. Cette opération renverra un ensemble de documents. De plus, nous avons mis à jour la valeur de department_id et emploi selon la requête définie.

3.2. Utiliser bson Documents

Nous pouvons effectuer toutes les opérations MongoDB en utilisant le bson document. Pour cela, nous avons d'abord besoin de l'objet de collection, puis effectuons l'opération de mise à jour à l'aide de updateMany méthode avec le filtre et définir fonctions.

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

Ici, nous passons un filtre de requête au updateMany méthode. L'eq le filtre correspond à employee_id avec le texte correspondant exact '794875'. Ensuite, nous mettons à jour le department_id et le travail en utilisant le ensemble opérateur.

4. Utiliser Remplacer la requête

L'approche naïve pour mettre à jour les multiples champs d'un document consiste à le remplacer par un nouveau document dont les valeurs sont mises à jour.

Par exemple, si nous souhaitons remplacer un document par employee_id 794875, nous pouvons exécuter la requête suivante :

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

La commande ci-dessus imprimera un accusé de réception JSON dans la sortie :

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

Ici, le employee_id champ est utilisé pour filtrer le document. Le deuxième argument de la requête de mise à jour indique le document à partir duquel le document existant sera remplacé.

Dans la requête ci-dessus, nous effectuons replaceOne , par conséquent, il ne remplacera qu'un seul document par ce filtre. Alternativement, si nous voulons remplacer tous les documents par cette requête de filtre, nous aurions besoin d'utiliser le updateMany méthode.