根据文档(http://godoc.org/launchpad.net/mgo/v2),如果您使用Upsert方法,则可以获得“ Upserted”文档的ID。
还有一个不提供此功能的Insert方法。这是为什么?如果我要执行插入而不是Upsert怎么办? (或者永远不是要这样做的任何正当理由?我开始怀疑。)
您使用bson
。bson
生成要插入的ID。
这是您插入新文档的方式:
NewObjectId()
由于您不知道在发布NewObjectId()
时是否要插入或更新,因此仅生成ID以在查询后立即将其删除(以防发生更新)是多余的。这就是为什么它在生成数据库端并在适用时返回给您的原因。
这根本不应该发生,mgo应该插入并返回ID,因为如果我们从应用程序本身生成ObjectId,如果重新启动应用程序,则Object Id生成器将从头开始重新生成相同的ID。并再次更新数据库中的现有记录。
这是错误的,MGO应该依赖数据库来生成这些ID并更新对象或立即返回所插入对象的objectId,就像绑定到MongoDB的其他语言在Python或Java中所做的一样。
您总是可以尝试使用Upsert函数来获取生成的ID。
i := bson.NewObjectId()
c.Insert(bson.M{"_id": i, "foo": "bar"})
这是我的示例代码,可以正常工作.....