以下是我的查询/索引。当我以这种方式进行设置时,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就会停止。
谢谢!
答案 0 :(得分:0)
通过执行以下操作,我能够在运行查询时消除任何递归锁定:
我尝试移动优先级字段的位置,我尝试将优先级作为自己的排序索引,但是查找和修改想要对查找使用相同的查询,并且排序和优先级必须在每个都可以使用相同的索引。
查询:
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}