我正在使用labix mgo模块作为Go Mongo驱动程序。由于Go是并发的(并且是并行的),因此在应用程序中生成ObjectId是安全的还是仅应由数据库这样做?

如果.Insert()可以返回Id,那将非常简单。但是,当我需要这种方式时,有两种方法可以做到这一点:

1)在客户端上生成ObjectId并使用它

...
user.ID = bson.NewObjectId()
Users.Insert(user)
// use user.ID normally

2)让数据库生成ID并检索它
...
Users.Insert(user)
Users.Find(user).One(&user)
// user user.ID normally

第二种方法需要2个数据库请求和同步插入。

问题是:第一种方法和第二种方法安全吗?还是我应该处理更好的东西?

最佳答案

我会采用第一种方法,因为在这种情况下,您无需检索任何ID。

如果查看ObjectID的描述,您将看到它包含:

  • 一个4字节的值,表示自Unix时代以来的秒数
  • 3字节机器标识符
  • 一个2字节的进程ID,而
  • 一个3字节的计数器,以随机值开头。

  • 如您所见,即使您使用同一台机器在一个进程上运行(使2和3相同),您仍然能够每秒插入3个字节的整数。

    因此,如果您的写入速度小于每秒(2^8)^3 - 1 = 16777215,则不会发生冲突。

    每秒拥有1600万次插入是不现实的。

    关于mongodb - 创建ObjectId与让DB创建它,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31080415/

    10-13 07:47
    查看更多