相关疑难解决方法(0)

我可以按日期查询MongoDB ObjectId吗?

我知道ObjectIds包含它们的创建日期.有没有办法查询ObjectId的这个方面?

javascript mongodb

135
推荐指数
10
解决办法
7万
查看次数

mongodb 罗盘查询,对象Id在日期范围内

我正在尝试使用指南针在字段上执行日期范围查询_id。我已经使用以下过滤器尝试了在这里找到的内容:

{_id: { $gte: ObjectId.fromDate(new Date('2019-01-01')) } }
Run Code Online (Sandbox Code Playgroud)

我缺少什么?我想获取从某个日期开始的所有文档的列表(在本例中是从 2019 年 1 月 1 日至今)。不幸的是,文档字段中没有时间戳,因此我需要从对象 ID 中提取它。

mongodb mongodb-compass

10
推荐指数
2
解决办法
3万
查看次数

如何从时间戳转换为 Mongo ObjectID

我知道我们可以使用getTimestamp()从 ObjectId 中检索时间戳,但是有没有办法从时间戳生成 ObjectId?

更具体地说,如果我有的输入,那么我想将其转换为Mongo ObjectID以在 db 中查询,我该怎么做?

timestamp mongodb

6
推荐指数
2
解决办法
1万
查看次数

MongoDB:实现读/写锁(互斥锁)

我需要使用MongoDB实现一些锁定机制,以防止数据不一致,但允许脏读.

条件:

  • WRITE只有在没有READ锁定没有WRITE锁定的情况下才能获得锁定.

  • READ只有在没有WRITE锁定的情况下才能获得锁定.

  • READ单个文档上可以有许多并行锁.

  • 必须有某种超时机制:如果(无论出于何种原因)某个进程未释放其锁定,则应用程序必须能够恢复.

只需忽略查询中的所有锁即可进行脏读.

(WRITE进程的饥饿不是本主题的一部分)

为什么READWRITE锁/为什么不只使用WRITE锁:

让我们假设,我们有2个集合:contactscategories.这是一种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 …

multithreading mutex locking mongodb mongodb-query

5
推荐指数
0
解决办法
1333
查看次数