MongoDB检索最后插入的文档

时间:2013-07-07 10:19:33

标签: java mongodb nosql

我是MongoDB的新手,并试图找出一些基本要求的解决方案。

以下是该方案:  我有一个应用程序通过调度程序将信息保存到MongoDB。每次调度程序运行时,我都需要从db获取最后一个插入的文档,以获取我应该发送的最后一个信息ID,以获取下一组信息。此外,当我保存一个对象时,我需要验证它是否已经存在db中的某个字段的特定值,如果它在那里,我只需要更新该文档中的计数,否则将保存一个新的。

我的问题是:

  • 我正在使用MongoDB java驱动程序。自己生成对象id是好的,还是使用从驱动程序或MongoDB本身生成的内容是否合适?

  • 检索上次插入的文档以查找上次处理的信息ID的最佳方法是什么?

  • 如果我在每次插入之前在列中找到特定值,我担心应用程序的性能,因为它应该有数千条记录。进行此验证的最佳方法是什么?

  • 我在一些地方看到他们在进行插入时正在讨论两个写入,一个用于将文档写入集合,另一个用于将其写入另一个集合(最后更新)以跟踪最后插入的条目。这是一个好方法吗?我们通常不会使用关系数据库。

  • 我是否可以期望生成的对象ID对于将来插入的每个记录都是唯一的? (怀疑它是否可以重复)

    感谢。

1 个答案:

答案 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字段按日期排序。但是如果文档定期更新,那么我们需要使用查找和修改操作以原子方式修改文档。

http://api.mongodb.org/java/2.6/com/mongodb/DBCollection.html#findAndModify%28com.mongodb.DBObject,%20com.mongodb.DBObject,%20com.mongodb.DBObject,%20boolean,%20com.mongodb.DBObject,%20boolean,%20boolean%29

现在您已更新上次插入/修改的文档的日期。确保此字段已编入索引。现在使用上面的链接,查找 sort 参数并使用

填充它
    new BasicDbObject().put("infoId", -1); //-1 is for descending order.
  

我在一些地方看到他们在进行插入时正在讨论两个写入,一个用于将文档写入集合,另一个用于将其写入另一个集合(最后更新)以跟踪最后插入的条目。这是一个好方法吗?对于关系数据库,我们通常不会这样做。

可怕的想法!欢迎来到Mongo。你可以比这更好。

相关问题