为什么mgo不返回插入文档的ID?

问题描述 投票:25回答:3

根据文档(http://godoc.org/launchpad.net/mgo/v2),如果您使用Upsert方法,则可以获得“ Upserted”文档的ID。

还有一个不提供此功能的Insert方法。这是为什么?如果我要执行插入而不是Upsert怎么办? (或者永远不是要这样做的任何正当理由?我开始怀疑。)

mongodb go mgo
3个回答
46
投票

您使用bsonbson生成要插入的ID。

这是您插入新文档的方式:

NewObjectId()

由于您不知道在发布NewObjectId()时是否要插入或更新,因此仅生成ID以在查询后立即将其删除(以防发生更新)是多余的。这就是为什么它在生成数据库端并在适用时返回给您的原因。


2
投票

这根本不应该发生,mgo应该插入并返回ID,因为如果我们从应用程序本身生成ObjectId,如果重新启动应用程序,则Object Id生成器将从头开始重新生成相同的ID。并再次更新数据库中的现有记录。

这是错误的,MGO应该依赖数据库来生成这些ID并更新对象或立即返回所插入对象的objectId,就像绑定到MongoDB的其他语言在Python或Java中所做的一样。


1
投票

您总是可以尝试使用Upsert函数来获取生成的ID。

i := bson.NewObjectId()
c.Insert(bson.M{"_id": i, "foo": "bar"})

这是我的示例代码,可以正常工作.....

© www.soinside.com 2019 - 2024. All rights reserved.