带排序的复合索引

Compound index with sort

下面是我的query/index。当我以这种方式设置时,mongo 会收到递归锁条目的垃圾邮件。

查询:

  this._db.findAndModify(
    {
      name: jobName,
      disabled: { $ne: true },
      nextRunAt: {$lte: this._nextScanAt},      
      $or: [
        {lockedAt: null},
        {lockedAt: {$exists: false}},
        {lockedAt: {$lte: lockDeadline}}
      ]      
    },
    {'priority': -1},
    {$set: {lockedAt: now}},
    {'new': true},
    findJobsResultWrapper(this, cb)
  );

索引:

  {name: 1, disabled: 1, nextRunAt: 1, lockedAt: 1}

....... 如果我删除 {'priority': -1} 并替换它 {} 然后一切正常。所以我似乎无法破解带有排序字段的复合索引的代码。

我也试过:

{name: 1, disabled: 1, nextRunAt: 1, lockedAt: 1, priority: -1}

{priority: -1}
{name: 1, disabled: 1, nextRunAt: 1, lockedAt: 1}

无论我做什么,如果我将那种类型放在那里,那么数据库就会停止运行。

谢谢!

通过执行以下操作,运行 查询时我能够消除任何递归锁:

  1. 优先作为查询中的第一个字段
  2. 优先作为索引中的第一个字段

我尝试移动优先级字段的位置,我尝试将优先级作为其自己的排序索引,但是查找和修改想要对查找和排序使用相同的查询,并且优先级必须在每个中,以便他们可以使用相同的索引。

查询:

 this._db.findAndModify(
    {
      priority: {$exists: true},            
      name: jobName,
      disabled: { $ne: true },
      nextRunAt: {$lte: this._nextScanAt},      
      $or: [
        {lockedAt: null},
        {lockedAt: {$exists: false}},
        {lockedAt: {$lte: lockDeadline}}
      ]
    },
    {priority: -1},
    {$set: {lockedAt: now}},
    {'new': true},
    findJobsResultWrapper(this, cb)
  );

索引:

{priority: -1, name: 1, disabled: 1, nextRunAt: 1, lockedAt: 1}