Heim >Backend-Entwicklung >Golang >Benötigen Sie Hilfe beim Abrufen eines Elements aus dem Mongodb-Dokument und beim Aktualisieren seines Werts mit dem Go-Mongo-Treiber

Benötigen Sie Hilfe beim Abrufen eines Elements aus dem Mongodb-Dokument und beim Aktualisieren seines Werts mit dem Go-Mongo-Treiber

王林
王林nach vorne
2024-02-09 16:09:19986Durchsuche

需要帮助从 mongodb 文档获取元素并使用 go mongo 驱动程序更新其值

php-Editor Strawberry ist hier, um Ihnen ein häufiges Bedürfnis vorzustellen: wie man Elemente aus einem MongoDB-Dokument abruft und seinen Wert mit dem Go Mongo-Treiber aktualisiert. MongoDB ist eine beliebte NoSQL-Datenbank und Go ist eine leistungsstarke Programmiersprache, und die Kombination der beiden kann viele Vorteile bringen. In diesem Artikel untersuchen wir, wie Sie den Go Mongo-Treiber verwenden, um diese Anforderung zu erfüllen, und helfen Ihnen, diese Technologie besser zu verstehen und anzuwenden.

Frageninhalt

Hey, ich verwende das Paket go.mongodb.org/mongo-driver, um Golang zu verwenden. Das ist mein 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
}

Dies ist die Datenbankstruktur:

...
{
  "_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
}
...

Was ich mit meinem Code tun muss, ist, eine Liste von Aufkleberpaketen zu finden, die einer bestimmten ID und einem bestimmten Aufklebertyp entsprechen, und den Standardwert auf false 并将传递给 func 的包的默认值设置为 true festzulegen.

Grundsätzlich legen Sie einfach einen davon als Standard und die anderen als Nicht-Standard fest. Kann jemand erklären, warum diese Funktion „Dokument nicht gefunden“ zurückgibt?

Problemumgehung

Wenn mehrere Felder übereinstimmen, sollten Sie den $elemmatch 运算符。否则,$-Operator verwenden, der nicht funktioniert. Siehe Eingebettete Dokumente mithilfe mehrerer Feldabgleiche aktualisieren.

Und du brauchst updatemany 来更新单个文档中的多个数组元素。请改用 updateone nicht.

Hier ist eine Demo basierend auf Ihrem Code und Ihren Daten:

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)
    }
}

Führen Sie die Demo aus und Sie werden die folgenden Änderungen am Dokument feststellen:

--- 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",

Das obige ist der detaillierte Inhalt vonBenötigen Sie Hilfe beim Abrufen eines Elements aus dem Mongodb-Dokument und beim Aktualisieren seines Werts mit dem Go-Mongo-Treiber. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen