现在我们正在通过使用MongoDB的烘焙ID来完成我们所有独特的id生成。我们有一些实例需要在向数据库添加任何内容之前为对象创建id。
我们可以创建一个条目获取id,然后删除条目,如果我们最终永远不需要它,但我宁愿不把这个负载放在系统上这么简单的任务。有没有办法与mongos本机方法同步,而不会给数据库带来不必要的负担?
由于
答案 0 :(得分:6)
这很简单。除了upsert操作之外,ObjectId是客户端生成的。换句话说,当您在应用程序中执行保存操作时,驱动程序将自动执行(伪):
if(!doc.containsKey("_id"))
doc.put(_id, new ObjectId());
所以你要做的就是自己生成一个ObjectId,做你需要做的任何事情,然后将你的文档的_id设置为该值,而不是让mongo驱动为你做。
请注意,这与驱动程序生成ID一样安全完全。 ObjectIds旨在消除ID冲突(读取:使冲突点不太可能变得无关紧要)。此外,生成id和存储它之间的时间也不会引入ID冲突问题。
如果保存包含数据库中已存在的_id的文档,则会使用该_id覆盖原始文档。
如果插入包含已存在的_id的文档,则会出现重复的_id错误(错误11000)。
答案 1 :(得分:1)
您不必将Bson ObjectIds用作数据库中的ID(请参阅http://www.mongodb.org/display/DOCS/Object+IDs)。你可以自由地生成自己的。 C#驱动程序提供了一种生成ObjectIds客户端的方法。您使用什么JavaScript驱动程序来调用MongoDB?是否没有调用生成新的ObjectId?