我是MongoDB的新手,并试图找出一些基本要求的解决方案。
以下是该方案: 我有一个应用程序通过调度程序将信息保存到MongoDB。每次调度程序运行时,我都需要从db获取最后一个插入的文档,以获取我应该发送的最后一个信息ID,以获取下一组信息。此外,当我保存一个对象时,我需要验证它是否已经存在db中的某个字段的特定值,如果它在那里,我只需要更新该文档中的计数,否则将保存一个新的。
我的问题是:
我正在使用MongoDB java驱动程序。自己生成对象id是好的,还是使用从驱动程序或MongoDB本身生成的内容是否合适?
检索上次插入的文档以查找上次处理的信息ID的最佳方法是什么?
如果我在每次插入之前在列中找到特定值,我担心应用程序的性能,因为它应该有数千条记录。进行此验证的最佳方法是什么?
我在一些地方看到他们在进行插入时正在讨论两个写入,一个用于将文档写入集合,另一个用于将其写入另一个集合(最后更新)以跟踪最后插入的条目。这是一个好方法吗?我们通常不会使用关系数据库。
我是否可以期望生成的对象ID对于将来插入的每个记录都是唯一的? (怀疑它是否可以重复)
感谢。
答案 0 :(得分:1)
我是否可以期望生成的对象id对于将来插入的每个记录都是唯一的? (怀疑它是否可以重复)
我正在使用MongoDB java驱动程序。自己生成对象id是好的,还是使用从驱动程序或MongoDB本身生成的内容是否合适?
如果您没有为文档提供对象ID,mongo将自动为您生成它。所有文件肯定都有_id。以下是相关参考资料。
The relevant part is
ObjectId is a 12-byte BSON type, constructed using:
a 4-byte value representing the seconds since the Unix epoch,
a 3-byte machine identifier,
a 2-byte process id, and
a 3-byte counter, starting with a random value.
http://docs.mongodb.org/manual/reference/object-id/
我想这是足够的随机化(虽然糟糕的哈希选择,因为日期/时间单调增加)
如果我在每次插入之前在列中找到特定值,我会担心应用程序的性能,因为它应该有数千条记录。进行此验证的最佳方法是什么?
首先索引字段(mongodb中没有列,2个文档可以有不同的字段)。
db.collection_name.ensureIndex({fieldName : 1})
检索上次插入的文档以查找上次处理的>信息ID的最佳方法是什么?
有趣的事实。如果我们使用它一次然后删除文档,我们不需要信息ID字段。 _id字段按日期排序。但是如果文档定期更新,那么我们需要使用查找和修改操作以原子方式修改文档。
现在您已更新上次插入/修改的文档的日期。确保此字段已编入索引。现在使用上面的链接,查找 sort 参数并使用
填充它 new BasicDbObject().put("infoId", -1); //-1 is for descending order.
我在一些地方看到他们在进行插入时正在讨论两个写入,一个用于将文档写入集合,另一个用于将其写入另一个集合(最后更新)以跟踪最后插入的条目。这是一个好方法吗?对于关系数据库,我们通常不会这样做。
可怕的想法!欢迎来到Mongo。你可以比这更好。