我正在使用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个数据库请求和同步插入。
问题是:第二种方法是第二种安全吗?或者我应该做些什么更好的事情?
答案 0 :(得分:2)
我会选择第一种方法,因为在这种情况下你不需要检索任何ID。
如果您查看ObjectID的说明,您会看到它包含:
如您所见,即使您在一个进程上运行相同的计算机(使2和3相同),您仍然可以每秒插入3个字节的整数。
因此,如果您的写入速度低于每秒(2^8)^3 - 1 = 16777215
,则不会发生碰撞。
每秒有1600万次插入太不现实了。