带排序的复合索引

时间:2015-01-24 20:43:44

标签: mongodb mongodb-query

以下是我的查询/索引。当我以这种方式进行设置时,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}

无论我做什么,如果我把那种东西放在那里,那么DB就会停止。

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

    查询:

     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}