我知道ObjectIds包含它们的创建日期.有没有办法查询ObjectId的这个方面?
我正在尝试使用指南针在字段上执行日期范围查询_id。我已经使用以下过滤器尝试了在这里找到的内容:
{_id: { $gte: ObjectId.fromDate(new Date('2019-01-01')) } }
Run Code Online (Sandbox Code Playgroud)
我缺少什么?我想获取从某个日期开始的所有文档的列表(在本例中是从 2019 年 1 月 1 日至今)。不幸的是,文档字段中没有时间戳,因此我需要从对象 ID 中提取它。
我知道我们可以使用getTimestamp()从 ObjectId 中检索时间戳,但是有没有办法从时间戳生成 ObjectId?
更具体地说,如果我有月和年的输入,那么我想将其转换为Mongo ObjectID以在 db 中查询,我该怎么做?
我需要使用MongoDB实现一些锁定机制,以防止数据不一致,但允许脏读.
WRITE只有在没有READ锁定且没有WRITE锁定的情况下才能获得锁定.
READ只有在没有WRITE锁定的情况下才能获得锁定.
READ单个文档上可以有许多并行锁.
必须有某种超时机制:如果(无论出于何种原因)某个进程未释放其锁定,则应用程序必须能够恢复.
只需忽略查询中的所有锁即可进行脏读.
(WRITE进程的饥饿不是本主题的一部分)
READ和WRITE锁/为什么不只使用WRITE锁:让我们假设,我们有2个集合:contacts和categories.这是一种nm关系,每个联系人都有一个类别ID数组.
READ锁定:向联系人添加类别时,我们必须确保此类别不会被删除(需要WRITE锁定,请参阅下文).并且因为READ同一文档上可能存在许多锁,所以多个进程可以将此单个类别添加到多个联系人.
WRITE锁定:删除类别时,我们必须先从所有联系人中删除类别ID.在此操作正在运行时,我们必须确保无法将此类别添加到任何联系人(此操作需要READ锁定).之后我们可以安全地删除类别文档.
这样,总会有一致的状态.
这是最难的部分.我已经尝试过两次,但总是发现一些问题,似乎太难解决了.
基本思路:每次获取的锁都带有时间戳,直到此锁有效.如果此时间戳是过去的,我们可以忽略该锁定.当一个进程完成其任务时,它应该删除它的锁.
最大的挑战是拥有多个READ锁,每个READ锁都有自己的超时,但多个READ锁可以具有相同的超时值.释放READ锁时,它必须只释放自己,所有其他READ锁必须保留.
{
_id: 1234,
lock: {
read: [
ISODate("2015-06-26T12:00:00Z")
],
write: null
}
}
Run Code Online (Sandbox Code Playgroud)
要么lock.read可以包含元素,要么 lock.write …