Maison > Article > développement back-end > Besoin d'aide pour obtenir un élément du document mongodb et mettre à jour sa valeur à l'aide du pilote go mongo
l'éditeur php Strawberry est là pour vous présenter un besoin courant : comment récupérer des éléments d'un document MongoDB et mettre à jour sa valeur à l'aide du pilote Go Mongo. MongoDB est une base de données NoSQL populaire et Go est un langage de programmation puissant, et la combinaison des deux peut apporter de nombreux avantages. Dans cet article, nous explorerons comment utiliser le pilote Go Mongo pour répondre à cette exigence et vous aiderons à mieux comprendre et appliquer cette technologie.
Hé, j'utilise le package go.mongodb.org/mongo-driver pour utiliser Golang. Voici mon code :
package src import ( "context" "fmt" "log" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) var ( client *mongo.client stickerscol *mongo.collection ) func init() { log.println("setting up database...") var err error client, err = mongo.connect(context.background(), options.client().applyuri(envars.dburl)) if err != nil { log.fatal(err) } log.println("connected to database") stickerscol = client.database("stickersbot").collection("stickers") chatcol = client.database("stickersbot").collection("chat") } func changedefaultpack(userid int64, stickername string, format string) error { fmt.println(userid, stickername, format) filter := bson.m{ "_id": userid, "stickers.stickername": stickername, "stickers.stickerpacktype": format, } updateother := bson.m{ "$set": bson.m{ "stickers.$[elem].isdefault": false, }, } update := bson.m{ "$set": bson.m{ "stickers.$.isdefault": true, }, } arrayfilters := options.arrayfilters{ filters: []interface{}{bson.m{"elem.stickerpacktype": format}}, } updateoptions := options.update().setarrayfilters(arrayfilters) _, err := stickerscol.updatemany(context.todo(), filter, updateother, updateoptions) if err != nil { return err } ok, err := stickerscol.updateone(context.background(), filter, update, options.update().setupsert(true)) if err != nil { return err } if ok.modifiedcount == 0 { fmt.println("no document matched") return fmt.errorf("no document matched") } return err }
Voici la structure de la base de données :
... { "_id": 1633375527, "stickers": [ { "stickerpacktype": "static", "stickername": "gVtOy_1633375527_by_ChadManBot", "isdefault": true }, { "stickerpacktype": "animated", "stickername": "zIjsa_1633375527_by_ChadManBot", "isdefault": true }, { "stickerpacktype": "video", "stickername": "bJBle_1633375527_by_ChadManBot", "isdefault": true }, { "stickerpacktype": "static", "stickername": "iujiw_1633375527_by_ChadManBot", "isdefault": false }, { "stickerpacktype": "video", "stickername": "CHnqb_1633375527_by_ChadManBot", "isdefault": false }, { "stickerpacktype": "static", "stickername": "XKJUP_1633375527_by_ChadManBot", "isdefault": false }, { "stickerpacktype": "animated", "stickername": "pCFlC_1633375527_by_ChadManBot", "isdefault": false }, { "stickerpacktype": "animated", "stickername": "jGGgt_1633375527_by_ChadManBot", "isdefault": false }, { "stickerpacktype": "animated", "stickername": "cTxyA_1633375527_by_ChadManBot", "isdefault": false }, { "stickerpacktype": "animated", "stickername": "ZfYXO_1633375527_by_ChadManBot", "isdefault": false }, { "stickerpacktype": "static", "stickername": "xJUkA_1633375527_by_ChadManBot", "isdefault": false }, { "stickerpacktype": "static", "stickername": "HIvsY_1633375527_by_ChadManBot", "isdefault": false }, { "stickerpacktype": "static", "stickername": "WIHFQ_1633375527_by_ChadManBot", "isdefault": false }, { "stickerpacktype": "static", "stickername": "OqjtE_1633375527_by_ChadManBot", "isdefault": false }, { "stickerpacktype": "static", "stickername": "QNysO_1633375527_by_ChadManBot", "isdefault": false }, { "stickerpacktype": "static", "stickername": "OrTsT_1633375527_by_ChadManBot", "isdefault": false }, { "stickerpacktype": "static", "stickername": "FzROg_1633375527_by_ChadManBot", "isdefault": false }, { "stickerpacktype": "static", "stickername": "QUBcT_1633375527_by_ChadManBot", "isdefault": false }, { "stickerpacktype": "static", "stickername": "NsZfM_1633375527_by_ChadManBot", "isdefault": false }, { "stickerpacktype": "static", "stickername": "AkxVM_1633375527_by_ChadManBot", "isdefault": false }, { "stickerpacktype": "static", "stickername": "Ddvus_1633375527_by_ChadManBot", "isdefault": false }, { "stickerpacktype": "static", "stickername": "LXfHV_1633375527_by_ChadManBot", "isdefault": false }, { "stickerpacktype": "static", "stickername": "sTaMv_1633375527_by_ChadManBot", "isdefault": false }, { "stickerpacktype": "static", "stickername": "vppgK_1633375527_by_ChadManBot", "isdefault": false } ], "stickerpackcount": 2 } ...
Ce dont j'ai besoin, c'est que mon code trouve une liste de packs d'autocollants correspondant à un identifiant et un type d'autocollant donnés et définisse sa valeur par défaut sur false
并将传递给 func 的包的默认值设置为 true
.
En gros, définissez simplement l'un d'entre eux par défaut et les autres par défaut. Quelqu'un peut-il expliquer pourquoi cette fonction renvoie un document introuvable ?
Lorsque plusieurs champs correspondent, vous devez utiliser l'opérateur $elemmatch
运算符。否则,$
qui ne fonctionne pas. Voir Mise à jour de documents intégrés à l'aide de la correspondance de plusieurs champs.
Et vous n’avez pas besoin de updatemany
来更新单个文档中的多个数组元素。请改用 updateone
.
Voici une démo basée sur votre code et vos données :
package main import ( "context" "fmt" "log" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) var ( client *mongo.client stickerscol *mongo.collection ) func init() { log.println("setting up database...") var err error client, err = mongo.connect(context.background(), options.client().applyuri("mongodb://localhost")) if err != nil { log.fatal(err) } log.println("connected to database") stickerscol = client.database("stickersbot").collection("stickers") } func changedefaultpack(userid int64, stickername string, format string) error { fmt.println(userid, stickername, format) filter := bson.m{ "_id": userid, "stickers": bson.m{ "$elemmatch": bson.m{ "stickername": stickername, "stickerpacktype": format, }, }, } updateother := bson.m{ "$set": bson.m{ "stickers.$[elem].isdefault": false, }, } arrayfilters := options.arrayfilters{ filters: []interface{}{bson.m{"elem.stickerpacktype": format}}, } updateoptions := options.update().setarrayfilters(arrayfilters) result, err := stickerscol.updateone(context.background(), filter, updateother, updateoptions) if err != nil { return err } log.printf("update other: %+v\n", result) update := bson.m{ "$set": bson.m{ "stickers.$.isdefault": true, }, } ok, err := stickerscol.updateone(context.background(), filter, update, options.update().setupsert(true)) if err != nil { return err } log.printf("update default: %+v\n", ok) if ok.modifiedcount == 0 { fmt.println("no document matched") return fmt.errorf("no document matched") } return err } func main() { if err := changedefaultpack(1633375527, "ddvus_1633375527_by_chadmanbot", "static"); err != nil { panic(err) } }
Lancez la démo et vous observerez les modifications suivantes dans le document :
--- before.json 2023-06-27 00:34:32.721978745 +0800 after.json 2023-06-27 00:34:59.489836137 +0800 @@ -4,7 +4,7 @@ { "stickerpacktype": "static", "stickername": "gVtOy_1633375527_by_ChadManBot", - "isdefault": true + "isdefault": false }, { "stickerpacktype": "animated", @@ -104,7 +104,7 @@ { "stickerpacktype": "static", "stickername": "Ddvus_1633375527_by_ChadManBot", - "isdefault": false + "isdefault": true }, { "stickerpacktype": "static",
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!