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

Guide d'upsert dans MongoDB

1. Présentation

Upsert est une combinaison d'insertion et de mise à jour (inSERT + UPdate =upsert). Nous pouvons utiliser le upsert avec différentes méthodes de mise à jour, c'est-à-dire mise à jour , trouverEtModifier , et replaceOne .

Ici, dans MongoDB, le upsert l'option est un booléen valeur. Supposons que la valeur soit true et les documents correspondent au filtre de requête spécifié. Dans ce cas, l'opération de mise à jour appliquée mettra à jour les documents. Si la valeur est true et qu'aucun document ne correspond à la condition, cette option insère un nouveau document dans la collection. Le nouveau document contiendra les champs basés sur le filtre et les opérations appliquées.

Dans ce didacticiel, nous allons d'abord examiner le upsert dans la requête MongoDB Shell, puis utilisez le code du pilote Java.

2. Initialisation de la base de données

Avant d'aller de l'avant pour effectuer le upsert opérations, nous devons d'abord créer une nouvelle base de données baeldung et une collection d'échantillons, véhicule :

db.vehicle.insertMany([
{
    "companyName":"Nissan", 
    "modelName":"GTR",
    "launchYear":2016,
    "type":"Sports",
    "registeredNo":"EPS 5561"
},
{ 
    "companyName":"BMW",
    "modelName":"X5",
    "launchYear":2020,
    "type":"SUV",
    "registeredNo":"LLS 6899"
},
{
    "companyName":"Honda",
    "modelName":"Gold Wing",
    "launchYear":2018,
    "type":"Bike",
    "registeredNo":"LKS 2477"
}]);

En cas d'insertion réussie, la commande ci-dessus imprimera un JSON similaire à celui illustré ci-dessous :

{
    "acknowledged" : true, 
    "insertedIds" : [
        ObjectId("623c1db39d55d4e137e4781b"),
	ObjectId("623c1db39d55d4e137e4781c"),
	ObjectId("623c1db39d55d4e137e4781d")
    ]
}

Nous avons ajouté avec succès les données factices dans la collection véhicule .

3. Utiliser la mise à jour Méthode

Dans cette section, nous apprendrons à utiliser le upsert option avec la mise à jour méthode. L'objectif principal de l'upsert l'option est de mettre à jour le document existant en fonction du filtre appliqué ou d'insérer un nouveau document si le filtre n'obtient pas la correspondance .

A titre d'illustration, nous utiliserons le $setOnInsert opérateur avec le upsert option pour obtenir un avantage supplémentaire lors de l'insertion de nouveaux champs dans le document.

Examinons une requête dans laquelle la condition de filtre correspond au document existant de la collection :

db.vehicle.update(
{
    "modelName":"X5"
},
{
    "$set":{
        "companyName":"Hero Honda"
    }
},
{
    "upsert":true
});

La requête ci-dessus renverra le document suivant :

{ 
    "nMatched" : 1, 
    "nUpserted" : 0,
    "nModified" : 1 
}

Ici, nous verrons le code du pilote Java correspondant à la requête mongo shell ci-dessus :

UpdateOptions options = new UpdateOptions().upsert(true);
UpdateResult updateResult = collection.updateOne(Filters.eq("modelName", "X5"), 
  Updates.combine(Updates.set("companyName", "Hero Honda")), options);
System.out.println("updateResult:- " + updateResult);

Dans la requête ci-dessus, le champ modelName "X5" existe déjà dans la collection, donc le champ companyName de ce document sera mis à jour en "Hero Honda".

Voyons maintenant un exemple de upsert en utilisant l'option $setOnInsert opérateur. Elle ne sera applicable qu'en cas d'ajout d'un nouveau document :

db.vehicle.update(
{
    "modelName":"GTPR"
},
{
    "$set":{
        "companyName":"Hero Honda"
    },
    "$setOnInsert":{
        "launchYear" : 2022,
	"type" : "Bike",
	"registeredNo" : "EPS 5562"
    },  
},
{
    "upsert":true
});

La requête ci-dessus renverra le document suivant :

{
    "nMatched" : 0,
    "nUpserted" : 1,
    "nModified" : 0,
    "_id" : ObjectId("623b378ed648af670fe50e7f")
}

Le code du pilote Java de la requête de mise à jour ci-dessus avec le $setOnInsert l'option sera :

UpdateResult updateSetOnInsertResult = collection.updateOne(Filters.eq("modelName", "GTPR"),
  Updates.combine(Updates.set("companyName", "Hero Honda"),
  Updates.setOnInsert("launchYear", 2022),
  Updates.setOnInsert("type", "Bike"),
  Updates.setOnInsert("registeredNo", "EPS 5562")), options);
System.out.println("updateSetOnInsertResult:- " + updateSetOnInsertResult);

Ici, dans la requête ci-dessus, la condition de filtre du champ modelName "GTPR" ne correspond à aucun document de collection, nous allons donc ajouter un nouveau document à la collection. Le point clé à noter est que le $setOnInsert ajoute tous les champs dans le nouveau document.

4. Utilisation de findAndModify Méthode

Nous pouvons également utiliser le upsert option à l'aide de findAndModify méthode. Pour cette méthode, la valeur par défaut de upsert l'option est fausse . Si nous définissons le upsert option sur vrai , il fonctionnera exactement de la même manière que la méthode de mise à jour.

Voyons un cas d'utilisation de findAndModify méthode avec le upsert option vrai :

db.vehicle.findAndModify(
{
    query:{
        "modelName":"X7"
    },
    update: {
        "$set":{
            "companyName":"Hero Honda"
        }
    },
    "upsert":true,
    "new":true
});

Dans ce cas, la requête ci-dessus renverra le document nouvellement créé. Examinons le code du pilote Java de la requête ci-dessus :

FindOneAndUpdateOptions upsertOptions = new FindOneAndUpdateOptions();
  upsertOptions.returnDocument(ReturnDocument.AFTER);
  upsertOptions.upsert(true);
Document resultDocument = collection.findOneAndUpdate(Filters.eq("modelName", "X7"),
  Updates.set("companyName", "Hero Honda"), upsertOptions);
System.out.println("resultDocument:- " + resultDocument);

Ici, nous avons d'abord créé la condition de filtre et sur cette base, soit nous mettrons à jour le document existant, soit nous ajouterons un nouveau document à la collection véhicule .

5. Utilisation de replaceOne Méthode

Effectuons le upsert opération à l'aide de replaceOne méthode. Le replaceOne La méthode de MongoDB remplace simplement le document unique dans la collection si la condition correspond.

Examinons d'abord la requête du shell Mongo de la méthode de remplacement :

db.vehicle.replaceOne(
{
    "modelName":"GTPR"
},
{
    "modelName" : "GTPR",
    "companyName" : "Hero Honda",
    "launchYear" : 2022,
    "type" : "Bike",
    "registeredNo" : "EPS 5562"
},
{
    "upsert":true
});

La requête ci-dessus renverra la réponse suivante :

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

Maintenant, écrivons la requête ci-dessus en utilisant le code du pilote Java :

Document replaceDocument = new Document();
replaceDocument.append("modelName", "GTPP")
  .append("companyName", "Hero Honda")
  .append("launchYear", 2022)
  .append("type", "Bike")
  .append("registeredNo", "EPS 5562");
UpdateResult updateReplaceResult = collection.replaceOne(Filters.eq("modelName", "GTPP"), replaceDocument, options);
System.out.println("updateReplaceResult:- " + updateReplaceResult);

Ici, dans ce cas, nous devons d'abord créer un nouveau document par lequel nous voulons remplacer le document existant, et avec le upsert option vrai , nous ne remplacerons le document que si la condition est remplie.