Maison > développement back-end > Golang > le corps du texte

Comment mettre à jour plusieurs enregistrements dans une requête basée sur différentes clés dans Mongo ?

PHPz
Libérer: 2024-02-15 11:51:08
avant
668 Les gens l'ont consulté

如何在一个查询中根据 Mongo 中的不同键更新多条记录?

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.

Contenu de la question

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" },
} )
Copier après la connexion

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"}]
Copier après la connexion

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),我的 filterupdate ?

Merci pour votre aide.

Solution de contournement

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.writemodelmise à 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"}}),
}
Copier après la connexion

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"),
}
Copier après la connexion

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}}),
    )
}
Copier après la connexion

Vous pouvez effectuer toutes les mises à jour avec un seul appel comme celui-ci :

res, err := coll.BulkWrite(ctx, wm)
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal