Lors de l'utilisation de MongoDB, nous devons parfois mettre à jour plusieurs enregistrements en fonction de différentes clés, et ce problème peut prêter à confusion. Cependant, heureusement dans MongoDB, nous pouvons utiliser l'opération Bulk Write pour atteindre cet objectif. L'écriture en masse est une opération d'écriture en masse qui peut effectuer plusieurs opérations de mise à jour, d'insertion ou de suppression en une seule opération. Dans cet article, je vais vous présenter comment utiliser Bulk Write pour mettre à jour plusieurs enregistrements en fonction de différentes clés dans Mongo.
Si j'ai quelque chose de similaire à ce qui suit...
collection.insertmany(context.todo(), []interface{}{ bson.m{ "_id" : 1, "member" : "abc123", "status" : "p" }, bson.m{ "_id" : 2, "member" : "xyz123", "status" : "a" }, bson.m{ "_id" : 3, "member" : "lmn123", "status" : "p" }, bson.m{ "_id" : 4, "member" : "pqr123", "status" : "d" }, bson.m{ "_id" : 5, "member" : "ijk123", "status" : "p" }, bson.m{ "_id" : 6, "member" : "cde123", "status" : "a" }, } )
Est-il possible d'appliquer les mises à jour suivantes dans une requête insertmany ?
[{"_id" : "1", "status" : "P0-A0"}, {"_id" : "2", "status" : "P0-A1"}, {"_id" : "3", "status" : "P0-A2"}, {"_id" : "4", "status" : "P0-A3"}, {"_id" : "5", "status" : "P0-A4"}, {"_id" : "6", "status" : "P0-A5"}]
Si oui, comment cela se ferait-il avec Golang ?
Plus précisément, que se passerait-il si vous utilisiez collection.updatemany(context.todo(), filter, update)
,我的 filter
和 update
?
Merci pour votre aide.
Vous ne pouvez pas faire cela avec un collection.updatemany()
调用,因为您无法对不同的匹配文档应用不同的更新文档。您必须多次调用 collection.updatemany()
, un pour chaque document de mise à jour différent.
Si vous souhaitez le faire efficacement avec un seul appel, vous pouvez utiliser la collection.bulkwrite()
。您必须准备一个不同的 mongo.writemodel
mise à jour par document.
Cela pourrait ressembler à ceci :
wm := []mongo.writemodel{ mongo.newupdateonemodel().setfilter(bson.m{"_id": "1"}).setupdate(bson.m{"$set": bson.m{"status": "p0-a0"}}), mongo.newupdateonemodel().setfilter(bson.m{"_id": "2"}).setupdate(bson.m{"$set": bson.m{"status": "p0-a1"}}), mongo.newupdateonemodel().setfilter(bson.m{"_id": "3"}).setupdate(bson.m{"$set": bson.m{"status": "p0-a2"}}), mongo.newupdateonemodel().setfilter(bson.m{"_id": "4"}).setupdate(bson.m{"$set": bson.m{"status": "p0-a3"}}), mongo.newupdateonemodel().setfilter(bson.m{"_id": "5"}).setupdate(bson.m{"$set": bson.m{"status": "p0-a4"}}), mongo.newupdateonemodel().setfilter(bson.m{"_id": "6"}).setupdate(bson.m{"$set": bson.m{"status": "p0-a5"}}), }
Il y a trop de "répétitions" dans la tranche littérale ci-dessus, vous pouvez les capturer à l'aide d'une fonction d'assistance :
create := func(id, newstatus string) *mongo.updateonemodel { return mongo.newupdateonemodel(). setfilter(bson.m{"_id": id}). setupdate(bson.m{"$set": bson.m{"status": newstatus}}) } wm := []mongo.writemodel{ create("1", "p0-a0"), create("2", "p0-a1"), create("3", "p0-a2"), create("4", "p0-a3"), create("5", "p0-a4"), create("6", "p0-a5"), }
De plus, s'il existe une logique dans la mise à jour qui peut être facilement définie, utilisez une boucle au lieu de lister tous les éléments :
var wm []mongo.writemodel for i := 1; i <= 6; i++ { newstatus := fmt.sprintf("p0-a%d", i-1) wm = append(wm, mongo.newupdateonemodel(). setfilter(bson.m{"_id": strconv.itoa(i)}). setupdate(bson.m{"$set": bson.m{"status": newstatus}}), ) }
Vous pouvez effectuer toutes les mises à jour avec un seul appel comme celui-ci :
res, err := coll.BulkWrite(ctx, wm)
Afficher le contenu associé : mongodb met à jour le tableau de documents et remplace-le par remplacer le tableau de documents
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!