mongodb - 当没有匹配的文档时,为什么 MongoDB update() 比 find() 慢,这可以更改吗?
问题描述
考虑以下两种(可能)更新一堆记录的方法:
方法 1(“查找并可能更新”):
let ids = db.getCollection("users").find({
"status.lastActivity": {"$lte": timeoutDate}
}, {
"fields": {"_id": 1}
}).fetch().map(doc => {
doc = doc._id;
return doc
});
if (ids.length) {
db.getCollection("users").update({
"_id": {"$in": ids}
}, {
"$set": {
"status.idle": true
}
}, {
"multi": true
});
}
方法2(“直接更新”):
db.getCollection("users").update({
"status.lastActivity": {"$lte": timeoutDate}
}, {
"$set": {
"status.idle": true
}
}, {
"multi": true
});
现在为了简单起见,让我们假设永远不会有小于status.lastActivity
小于的用户timeoutDate
(所以ids
也总是一个空数组)。
在这种情况下,我使用方法 1获得了明显更好的性能。方法 1 需要 0.1 到 2 毫秒,而方法 2 需要 40 到 80 毫秒。
我现在的问题是,为什么会这样?当我实际使用方法 2 并且实际上没有选择器匹配的记录时,我会假设 MongoDB 足够“聪明”,可以在引擎盖下做类似于方法 1 的事情......
我可以以某种方式改变它,让它以这种方式工作吗?还是我可能是某种错误的配置导致了这种情况,我可以摆脱?因为显然在方法 2 中写东西会更精简......
解决方案
这是在JS中吗?db.getCollection("users").find(
看起来它应该返回一个 Promise,并且 Promise 没有长度,所以被门控的更新代码ids.length
永远不会运行。