我对使用MongoDB还比较陌生。
我需要检索MongoDB集合中给定记录的前一条记录。
- 是否可以通过"_id = ObjectId(...)"字段来实现?
- 如果不行,那么我们是否需要显式插入一个带有顺序值的键来标识给定记录的前一条记录?(假设当前集合中没有顺序键/值对)
非常感谢任何帮助。
我对使用MongoDB还比较陌生。
我需要检索MongoDB集合中给定记录的前一条记录。
非常感谢任何帮助。
一切都相等的情况下,_id
字段的默认值是一个单调递增的ObjectId
。
这意味着,如果已知一个ObjectId
值,则可以使用以下方法检索在其之前插入的文档:
db.collection.find(
{ "_id": { "$lt": ObjectId("538c271a19b3a188ca6135eb") }}
).sort({ "_id": -1 }).limit(1)
这是一般情况。唯一可能的变化是不同来源生成ObjectId
值,并且它们的时钟设置为不同的时间(例如完全不同的UTC时间)。
因此,结合插入速率,您可以考虑是否对您足够好。除了罕见且管理不善的情况之外,应该永远不会出现顺序未被保留的情况。
我建议您使用索引以获得最佳性能。
例如: 创建索引:
db.books.ensureIndex({book: 1}) // for next records in collection
db.books.ensureIndex({book: -1}) // for previous records in collection
db.books.find({book: {$gt:"a"}}).sort({book: 1}).hint({book: 1}).limit(1)
之前的查询看起来像这样:
db.books.find({book: {$lt:"b"}}).sort({book: -1}).hint({book: -1}).limit(1)
_id
字段始终被索引,并且对于优化器来说是最快的访问点,因为它是始终存在的主索引。 - undefinedval collection = MongoConnection()(<数据库名称>)(<集合名称>) collection.ensureIndex(DBObject("days"-> 1)) val record = (collection.find("days" $lt begin)).sort(MongoDBObject("days" -> -1)).limit(1)
- undefined_id
字段。 - undefinedhint()
来指定索引的使用。强制使用提示会迫使查询优化器使用特定的索引,除非您确定查询优化器没有正确处理,否则应该谨慎使用。您可以通过explain(true)
查看查询计划的详细信息。 - undefined