【问题标题】:cannot set type primitive.ObjectID to ObjectID无法将类型 original.ObjectID 设置为 ObjectID
【发布时间】:2021-06-29 00:47:29
【问题描述】:

使用 docstore 集合迭代器将 mongodb 文档绑定到 GO Struct 时出现此错误。

数据库:Azure CosmosDB mongoDb API Go Driver: Docstore

代码详情:

Cosmos DB 构造函数代码

    client, err := c.newClient(ctx, true)
    if err != nil {
        log.Error("error connecting to mongodb cluster", zap.Error(err))
        return nil, err
    }

    database := client.Database(c.dbName)
    collection := database.Collection(c.collName)

    return mongodocstore.OpenCollection(collection, "", nil)

用于映射 Mongo Db 文档的 Go struct

type utterance struct {
    ID               primitive.ObjectID `docstore:"_id,omitempty"`
    User             string             `docstore:"user,omitempty"`
    Locale           string             `docstore:"Locale,omitempty"`
    Text             string             `docstore:"Text,omitempty"`
    Source           string             `docstore:"Source,omitempty"`
    Timestamp        time.Time          `docstore:"Timestamp,omitempty"`
    DocstoreRevision interface{}
}

MondoDb 文档

{
    "_id" : ObjectId("60d5e18539864e948a8851a6"),
    "User" : "auth0|6049b5ef5d79540071db6a0a",
    "Locale" : "en_US",
    "Text" : "Hi",
    "Source" : "UTTERANCE_SOURCE_USER",
    "Timestamp" : {
        "$date" : 1624629637002
    },
    "DocstoreRevision" : "bf3b35d8-54ed-4a23-a08f-7d41b5c34085"
}

调用docstore集合并迭代的方法

i := s.collection.Query().Get(ctx)
    defer i.Stop()

    var results []*services.Utterance

    for {
        fmt.Println("for every document: ")
        //var native utterance
        doc := &utterance{}
        err := i.Next(ctx, doc) //error at this line
        if err == io.EOF {
            break
        } else if err != nil {
            fmt.Println(“getting to this err block“)
            return nil, err
        }

        u := doc.ToProto()
        results = append(results, u)
    }

【问题讨论】:

    标签: mongodb go


    【解决方案1】:

    尝试将ID 设置为指针类型:

    type utterance struct {
        ID               *primitive.ObjectID `docstore:"_id,omitempty"`
        User             string             `docstore:"user,omitempty"`
        Locale           string             `docstore:"Locale,omitempty"`
        Text             string             `docstore:"Text,omitempty"`
        Source           string             `docstore:"Source,omitempty"`
        Timestamp        time.Time          `docstore:"Timestamp,omitempty"`
        DocstoreRevision interface{}
    }
    

    可能当您创建要解码的结构时,primitive.ObjectID 正在初始化,而驱动程序不知道要对其进行解码。

    并且要小心。 docstore 是通用文档驱动程序。它不是特定于 MongoDB 的。所以它可能不适用于 MongoDB 特定类型。


    读取mongodbhttps://pkg.go.dev/gocloud.dev/docstore/mongodocstore的驱动

    有一种方法可以设置存储在_id 字段中的内容。我了解 docstore 不知道如何从 MongoDB 解码 ObjectID

    【讨论】:

    • 感谢您的回复。尝试使用 *primitive.ObjectID,但得到与以前相同的错误。
    • 所以docstore 可能无法解码ObjectID,如果您删除它是否有效?如果你把它改成字符串呢?
    • 是的pkg.go.dev/gocloud.dev/docstore/mongodocstore,它不起作用,但它有解决方法。如果您检查链接,有一种方法可以更改 _id 字段中保存的内容
    • 如果我删除,它会给出错误提示“没有匹配“_id”的字段”。如果我将其更改为字符串错误是“无法将类型字符串设置为 ObjectID”
    • 感谢@lucas 那天的快速帮助。我也更喜欢使用 mongodb-driver 而不是 Docstore。它现在正在工作。
    猜你喜欢
    • 2011-12-28
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 2020-12-11
    • 2017-09-23
    • 2018-09-06
    相关资源
    最近更新 更多