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

2 回复

尝试为 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 要求结构体中有一个名为 IDId 的字段(大写),它会自动映射到 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),确保标签中的字段名完全一致。

回到顶部