【问题标题】:mgo NewObjectId corrupt on insertmgo NewObjectId 在插入时损坏
【发布时间】:2015-07-06 23:13:54
【问题描述】:

如果我在 mgo 中为文档生成新的对象 ID:

obId := bson.NewObjectId()

然后插入它,它最终在 mongo 中(通过 cli 查找)为

"_id" : "U�`�\u0006@�\rU\u0000\u0000\u0001"

应该是什么时候

"_id" : ObjectId("559a47643d9827f0d9405420")

如果我尝试更新通过

生成 id 的现有文档,情况也是如此
obId := bson.ObjectIdHex(stringId)

它仍然被序列化为损坏的格式。

我尝试插入的结构如下所示:

type MyStruct struct {
    Id            bson.ObjectId `bson:"_id,omitempty" json:"id"`
    ...
}

【问题讨论】:

  • 如何在显示为"_id" : "U��\u0006@�\rU\u0000\u0000\u0001"`的地方打印它?
  • 我正在使用mongo cli 命令并且只是复制db.mycol.find() 的输出。问题是,自动生成的 id 显示为 ObjectId("blah...")

标签: mongodb go mgo


【解决方案1】:

"U�`�\u0006@�\rU\u0000\u0000\u0001" 表示清楚地表明 ObjectId 作为字符串而不是作为正确类型的对象 ID 发送到数据库。之前的每一个这样的情况都是应用程序端的代码路径错误地显式传递字符串。我建议调查在该集合中插入对象的每个代码路径,如果您找不到将其作为实际字符串发送的案例,则尝试创建一个复制器并将其向上游报告给 mgo 驱动程序。

更新:根据您在下面的评论,导致该问题的原因是应用程序的某些部分使用了包中的 ObjectId 类型,而该类型不是在与数据库通信期间实际使用的包.这具有上述效果:来自错误包的ObjectId 类型只是一个普通字符串,就正确的bson 包而言。

【讨论】:

  • 希望问题得到解决。我正在使用一个通过gopkg.in/mgo.v2 导入mgo 的库。我自己和gopkg.in/v2/mgo 都在导入mgo。将外部代码复制到项目中并使其全部从labix.org/v2/mgo 导入后,它现在可以工作了。所以可能是路径混乱造成的。
  • labix.org/v2/mgo 已经非常老了。请改用 gopkg.in/mgo.v2。
  • 感谢@Gustavo,将更新导入到该路径。
猜你喜欢
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多