根據文檔(http://godoc.org/launchpad.net/mgo/v2),如果使用Upsert方法,您可以獲取「Upserted」文檔的ID。Golang/mgo:爲什麼mgo不能返回插入文檔的ID?
還有一個不提供此功能的插入方法。
這是爲什麼?如果我想執行插入操作而不是Upsert,該怎麼辦? (或者永遠不會有任何正當的理由想要這樣做?我開始懷疑。)
根據文檔(http://godoc.org/launchpad.net/mgo/v2),如果使用Upsert方法,您可以獲取「Upserted」文檔的ID。Golang/mgo:爲什麼mgo不能返回插入文檔的ID?
還有一個不提供此功能的插入方法。
這是爲什麼?如果我想執行插入操作而不是Upsert,該怎麼辦? (或者永遠不會有任何正當的理由想要這樣做?我開始懷疑。)
您使用bson
。 NewObjectId()
生成要插入的ID。
這是你將怎樣插入一個新的文檔:
i := bson.NewObjectId()
c.Insert(bson.M{"_id": i, "foo": "bar"})
既然你不知道,如果你要插入或更新時發出Upsert
,這將是多餘的生成ID只是在查詢後立即刪除它(萬一發生更新)。這就是爲什麼它會生成db端並在適用時返回給您。
這根本不應該發生,mgo應該插入並返回Id,因爲如果我們從應用程序本身生成ObjectId,如果應用程序重新啓動,Object Id生成器將從開始生成相同的ID一次又一次,從而更新數據庫中的現有記錄。
這是錯誤的,MGO應該依靠數據庫生成這些ID並更新對象或立即返回插入對象的objectId,就像其他語言綁定到MongoDB時在Python或Java中所做的一樣。
如果不是'bson.NewObjectId()''會使用'bson.NewObjectIdWithTime(time.Now())'重新啓動應用程序的問題不會是一個問題,對吧? – 2016-10-12 09:44:36
由於生成ObjectID的方法包含時間戳和PID,因此讀取ObjectID doc似乎不太可能。如果你碰巧得到了樣本PID並重置了你的系統時鐘,那麼你可能會得到ObjectID衝突,否則你很好。 https://docs.mongodb.com/manual/reference/method/ObjectId/ – 2017-08-13 16:43:55
您可以隨時嘗試使用Upsert功能獲取生成的ID。
db := service.ConnectDb()
sessionCopy := db.Copy()
defer sessionCopy.Close() // clean up
collection := sessionCopy.DB(service.MongoDB.DTB).C(MessageCol.tbl)
log.Println("before to write: ", msg)
// Update record inserts and creates an ID if wasn't set (Returns created record with new Id)
info, err := collection.Upsert(nil, msg)
if err != nil {
log.Println("Error write message upsert collection: ", err)
return MessageMgo{}, err
}
if info.UpsertedId != nil {
msg.Id = info.UpsertedId.(bson.ObjectId)
}
// gets room from mongo
room, err := GetRoom(msg.Rid)
if err != nil {
return msg, err
}
// increments the msgcount and update it
room.MsgCount = room.MsgCount + 1
err = UpdateRoom(room)
if err != nil {
return msg, err
}
return msg, err
這是一個示例代碼我已經和正常工作.....
我怎麼能取代「富」:「酒吧」與結構我已經創建了? – Acidic 2017-02-09 06:12:08
「如果應用程序重新啓動,則對象ID生成器將從一開始就開始生成相同的ID,從而更新數據庫中的現有記錄。」這是張貼在第二個答案,是非常重要的,沒有提到答案。我想你應該編輯答案,爲將來的人添加這些信息。 – cjf93 2017-06-19 10:16:12
@ cjf93這是不正確的(更多?)。如果你看看bson.ObjectId的實現,你會發現它考慮到了當前時間。這也在這裏解釋:https://github.com/go-mgo/mgo/issues/392 – 2017-08-27 14:48:46