首页 文章

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

提问于
浏览
23

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

还有一个不提供此功能的Insert方法 .
这是为什么?如果我想执行Insert而不是Upsert怎么办? (或者不会开始怀疑 . )

3 回答

  • 2

    你使用bson . NewObjectId()生成要插入的ID .

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

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

    由于您在发出 Upsert 时不会插入或更新,因此仅在查询后立即生成ID(如果发生更新)将是多余的 . 's why it'生成了db-side并在适用时返回给您 .

  • 1

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

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

  • 41

    您始终可以尝试使用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
    

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

相关问题