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

Opérations Push et Set dans la même mise à jour MongoDB

1. Présentation

$pousser est un opérateur de mise à jour dans MongoDB qui ajoute la valeur dans un tableau. En revanche, le $set L'opérateur est utilisé pour mettre à jour la valeur d'un champ existant dans le document.

Dans ce court tutoriel, nous allons vous présenter comment effectuer $push et $set opérations ensemble dans une seule requête de mise à jour.

2. Initialisation de la base de données

Avant d'aller de l'avant pour effectuer les multiples opérations de mise à jour, nous devons d'abord configurer une base de données baeldung et des marques de collection d'échantillons :

use baeldung;
db.createCollection(marks);

Insérons quelques documents dans la collection marks en utilisant insertMany méthode de la MongoDB :

db.marks.insertMany([
    {
        "studentId": 1023,
        "studentName":"James Broad",
        "joiningYear":"2018",
        "totalMarks":100,
        "subjectDetails":[
            {
                "subjectId":123,
                "subjectName":"Operating Systems Concepts",
                "marks":40
            },
            {
                "subjectId":124,
                "subjectName":"Numerical Analysis",
                "marks":60
            }
        ]
    },
    {
        "studentId": 1024,
        "studentName":"Chris Overton",
        "joiningYear":"2018",
        "totalMarks":110,
        "subjectDetails":[
            {
                "subjectId":123,
                "subjectName":"Operating Systems Concepts",
                "marks":50
            },
            {
                "subjectId":124,
                "subjectName":"Numerical Analysis",
                "marks":60
            }
        ]
    }
]);

En cas d'insertion réussie, la requête ci-dessus renverra la réponse suivante :

{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("622300cc85e943405d04b567"),
        ObjectId("622300cc85e943405d04b568")
    ]
}

Jusqu'à présent, nous avons inséré avec succès quelques exemples de documents dans la collection marques .

3. Comprendre le problème

Afin de comprendre le problème, commençons par comprendre le document que nous venons d'insérer. Il comprend les détails des étudiants et les notes obtenues par eux dans différentes matières. Les totalMarks  est la somme des notes obtenues dans différentes matières.

Considérons une situation où nous souhaitons ajouter un nouveau sujet dans le subjectDetails déployer. Pour également rendre les données cohérentes, nous devons mettre à jour le totalMarks champ également.

Dans MongoDB, nous allons d'abord ajouter le nouveau sujet dans le tableau à l'aide de la commande $push opérateur. Ensuite, nous définirons le totalMarks champ à une valeur particulière en utilisant le $set opérateur.

Ces deux opérations peuvent être effectuées individuellement en utilisant le $push et $set opérateur, respectivement. Mais nous pouvons écrire la requête MongoDB pour effectuer les deux opérations ensemble.

4. Utilisation de la requête shell MongoDB

Dans MongoDB, nous pouvons mettre à jour plusieurs champs d'un document en utilisant les différents opérateurs de mise à jour. Ici, nous utiliserons à la fois $push et $set opérateurs ensemble dans un updateOne requête.

Examinons l'exemple contenant à la fois $push et $set opérateurs ensemble :

db.marks.updateOne(
    {
        "studentId": 1023
    },
    {
        $set: {
            totalMarks: 170
        },
        $push: {
            "subjectDetails":{
                "subjectId": 126,
                "subjectName": "Java Programming",
                "marks": 70
            }
        }
    }
);

Ici, dans la requête ci-dessus, nous avons ajouté la requête de filtre basée sur le studentId. Une fois que nous obtenons le document filtré, nous mettons à jour le totalMarks en utilisant l'opérateur $set. En plus de cela, nous insérons les nouvelles données de sujet dans le subjectDetails tableau en utilisant le $push opérateur.

Par conséquent, la requête ci-dessus renverra la sortie suivante :

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

Ici, le matchedCount contient le nombre de documents correspondant au filtre, alors que modifiedCount contient le nombre de documents modifiés.

5. Code du pilote Java

Jusqu'à présent, nous avons discuté de la requête mongo shell pour utiliser le $push et $set opérateur ensemble. Ici, nous allons apprendre à implémenter la même chose en utilisant le code du pilote Java.

Avant d'aller de l'avant, commençons par nous connecter à la base de données et à la collection requise :

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

Ici, nous nous connectons à MongoDB, qui s'exécute sur le port par défaut 27017 sur localhost.

Examinons maintenant le code du pilote Java :

Document subjectData = new Document()
  .append("subjectId", 126)
  .append("subjectName", "Java Programming")
  .append("marks", 70); 
UpdateResult updateQueryResult = collection.updateOne(Filters.eq("studentId", 1023), 
  Updates.combine(Updates.set("totalMarks", 170), 
  Updates.push("subjectDetails", subjectData)));

Dans cet extrait de code, nous avons utilisé le updateOne méthode, qui met à jour un seul document en fonction du filtre appliqué studentId 1023. Nous avons ensuite utilisé le Updates.combine pour effectuer plusieurs opérations en un seul appel. Le champ totalMarks sera mis à jour à 170, et un nouveau document subjectData sera poussé vers le champ tableau "subjectDetails" .