Maison  >  Article  >  développement back-end  >  Comment mettre à jour plusieurs enregistrements dans une requête basée sur différentes clés dans Mongo ?

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

PHPz
PHPzavant
2024-02-15 11:51:08626parcourir

如何在一个查询中根据 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" },
} )

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),我的 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"}}),
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer