-3

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

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

我的问题是:

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

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

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

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

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

    谢谢。

4

1 回答 1

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})

检索最后插入的文档以查找最后处理的 >info id 的最佳方法是什么?

有趣的事实。如果我们使用一次然后删除文档,我们不需要 info id 字段。_id 字段按日期排序。但是如果文档是定期更新的,那么我们需要通过 find 和 modify 操作来原子地修改文档。

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

现在您已经更新了最后插入/修改文档的日期。确保该字段已编入索引。现在使用上面的链接,查找排序参数并填充它

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

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

可怕的想法!欢迎来到蒙哥。你可以做得比这更好。

于 2013-07-07T11:03:08.203 回答