Mongodb 使用指定排序和限制的查询更新集合

Mongodb 使用指定排序和限制的查询更新集合,mongodb,mongodb-.net-driver,Mongodb,Mongodb .net Driver,我有一个电子邮件通知集合,将由多个线程访问。我需要通过当前线程锁定一些记录,以便以独占方式使用它们 我的收藏如下: public class EmailNotification { [BsonId] public string Id { get; set; } public DateTime CreatedAt { get; set; } public string LockedBy { get; set; } public DateTime? Lo

我有一个电子邮件通知集合,将由多个线程访问。我需要通过当前线程锁定一些记录,以便以独占方式使用它们

我的收藏如下:

public class EmailNotification
{
    [BsonId]
    public string Id { get; set; }

    public DateTime CreatedAt { get; set; }

    public string LockedBy { get; set; }

    public DateTime? LockedUntil { get; set; }

    public int Priority { get; set; }

    ...
}
我的想法是通过首先更新“LockedBy”和“LockedUntil”字段来“软锁定”记录(并因此利用mongoDB更新锁定),然后在第二步检索我已经软锁定的记录并使用它们

我第一步有困难。我需要用更新命令锁定“N封最紧迫的电子邮件”。这意味着我需要找到所有“LockedUntil”字段在过去设置为null或某个值的记录,按“Priority”(desc)排序,然后按“CreatedAt”(asc)排序,并在一个命令中仅更新由该产生的前N条记录,以实现软锁定,而不会出现并发问题


我试图通过C#方法来实现这一点,因此必须使用CSharp驱动程序。有没有办法用最新版本的驱动程序(2.6)实现我所需要的功能?

您不能在一次原子更新中更新多个文档 命令:

在MongoDB中,写入操作,例如db.collection.update(), db.collection.findAndModify()、db.collection.remove()是原子的 单个文档的级别。对于必须更新的字段 同时,在同一文档中嵌入字段可确保 这些字段可以进行原子更新

如果试图实现此锁定模式,则在更新所有进程/线程之前,update命令可能会屈服于另一个进程/线程

您可以改为使用findandmodify调用在循环中一次锁定和检索一个文档

查找和修改方法

如果要查找匹配的文档并进行更新,请使用FindAndModify 它只需要一个原子操作。FindAndModify始终更新单个 文档,您可以组合匹配多个文档的查询 使用将准确确定匹配项的排序条件 文件已更新。此外,FindAndModify将返回 匹配文档(更新前或更新后),如果 您希望可以指定要删除的匹配文档的哪些字段 返回

findAndModify可通过C#驱动程序获得,其用途如下:


我想是这样的,但我希望有一个简单的选择。不过,我确实发现FindModify对我的目的很有用。非常感谢。