Golang使用docstore驱动连接MongoDB(Azure Cosmos DB)时出现错误如何解决
Golang使用docstore驱动连接MongoDB(Azure Cosmos DB)时出现错误如何解决 错误:"没有字段匹配 ‘_id’ 与 utterance"
我正在使用 docstore 包进行 MongoDB 连接。代码如下:
// 打开集合: // 使用 Azure Cosmos DB API,mongodocstore.OpenCollection 构造函数可以打开一个 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)
// 查询
i := s.collection.Query().Where("User", "=", user).Get(ctx)
defer i.Stop()
var results []*services.Utterance
for {
var native utterance
err := i.Next(ctx, &native) // 在这一行遇到上述错误
if err == io.EOF {
break
} else if err != nil {
fmt.Println("err here: ")
return nil, err
}
u := native.ToProto() // 格式化输出
results = append(results, u)
}
return results, nil
// 用于映射 MongoDB 文档的 Go 结构体
type utterance struct {
ID primitive.ObjectID `bson:"_id,omitempty"`
User string `bson:"User,omitempty"`
Locale string `bson:"Locale,omitempty"`
Text string `bson:"Text,omitempty"`
Source string `bson:"Source,omitempty"`
Timestamp time.Time `bson:"Timestamp,omitempty"`
DocstoreRevision interface{}
}
应该使用哪种标签格式与 Docstore 配合?是 bson 还是 docstore 本身的标签?
更多关于Golang使用docstore驱动连接MongoDB(Azure Cosmos DB)时出现错误如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html
尝试为 Go 结构体使用 docstore 注解本身:
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 设置为 ObjectID(“60d5e08639864e948a8851a5”)
更多关于Golang使用docstore驱动连接MongoDB(Azure Cosmos DB)时出现错误如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
错误信息“没有字段匹配 ‘_id’ 与 utterance”表明 docstore 在将 MongoDB 文档映射到 Go 结构体时,无法正确识别 _id 字段。docstore 默认使用结构体字段的 小写名称 进行映射,而不识别 bson 标签。对于 _id 字段,docstore 要求结构体中有一个名为 ID 或 Id 的字段(大写),它会自动映射到 MongoDB 的 _id。如果你的结构体字段标签是 bson:"_id",docstore 会忽略它,导致映射失败。
解决方案:在结构体中使用 docstore 标签 来显式指定字段映射。docstore 支持 docstore 标签,格式为 docstore:"字段名"。对于 _id 字段,必须通过标签明确映射。
修改你的 utterance 结构体,添加 docstore 标签。同时保留 bson 标签以兼容其他 MongoDB 操作(如果需要)。示例如下:
type utterance struct {
ID primitive.ObjectID `bson:"_id,omitempty" docstore:"_id"`
User string `bson:"User,omitempty" docstore:"User"`
Locale string `bson:"Locale,omitempty" docstore:"Locale"`
Text string `bson:"Text,omitempty" docstore:"Text"`
Source string `bson:"Source,omitempty" docstore:"Source"`
Timestamp time.Time `bson:"Timestamp,omitempty" docstore:"Timestamp"`
DocstoreRevision interface{}
}
关键点:
- 为
ID字段添加docstore:"_id"标签,这样 docstore 就能正确映射到 MongoDB 的_id字段。 - 其他字段也添加
docstore标签,确保一致性。字段名大小写应与 MongoDB 文档中的键匹配(例如User而不是user)。 DocstoreRevision字段是 docstore 用于修订控制的内部字段,无需标签。
修改后,docstore 在解码时会使用 docstore 标签进行映射,错误应该解决。如果 MongoDB 文档中的字段名是大小写敏感的(例如 User),确保标签中的字段名完全一致。

