创建ObjectId与让DB创建它

时间:2015-06-26 19:03:50

标签: mongodb go

我正在使用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个数据库请求和同步插入。

问题是:第二种方法是第二种安全吗?或者我应该做些什么更好的事情?

1 个答案:

答案 0 :(得分:2)

我会选择第一种方法,因为在这种情况下你不需要检索任何ID。

如果您查看ObjectID的说明,您会看到它包含:

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

如您所见,即使您在一个进程上运行相同的计算机(使2和3相同),您仍然可以每秒插入3个字节的整数。

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

每秒有1600万次插入太不现实了。