2012-08-17 135 views

回答

38

您使用bsonNewObjectId()生成要插入的ID。

這是你將怎樣插入一個新的文檔:

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

既然你不知道,如果你要插入或更新時發出Upsert,這將是多餘的生成ID只是在查詢後立即刪除它(萬一發生更新)。這就是爲什麼它會生成db端並在適用時返回給您。

+1

我怎麼能取代「富」:「酒吧」與結構我已經創建了? – Acidic 2017-02-09 06:12:08

+2

「如果應用程序重新啓動,則對象ID生成器將從一開始就開始生成相同的ID,從而更新數據庫中的現有記錄。」這是張貼在第二個答案,是非常重要的,沒有提到答案。我想你應該編輯答案,爲將來的人添加這些信息。 – cjf93 2017-06-19 10:16:12

+0

@ cjf93這是不正確的(更多?)。如果你看看bson.ObjectId的實現,你會發現它考慮到了當前時間。這也在這裏解釋:https://github.com/go-mgo/mgo/issues/392 – 2017-08-27 14:48:46

0

這根本不應該發生,mgo應該插入並返回Id,因爲如果我們從應用程序本身生成ObjectId,如果應用程序重新啓動,Object Id生成器將從開始生成相同的ID一次又一次,從而更新數據庫中的現有記錄。

這是錯誤的,MGO應該依靠數據庫生成這些ID並更新對象或立即返回插入對象的objectId,就像其他語言綁定到MongoDB時在Python或Java中所做的一樣。

+1

如果不是'bson.NewObjectId()''會使用'bson.NewObjectIdWithTime(time.Now())'重新啓動應用程序的問題不會是一個問題,對吧? – 2016-10-12 09:44:36

+0

由於生成ObjectID的方法包含時間戳和PID,因此讀取ObjectID doc似乎不太可能。如果你碰巧得到了樣本PID並重置了你的系統時鐘,那麼你可能會得到ObjectID衝突,否則你很好。 https://docs.mongodb.com/manual/reference/method/ObjectId/ – 2017-08-13 16:43:55

0

您可以隨時嘗試使用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 

這是一個示例代碼我已經和正常工作.....

相關問題