首页 > 解决方案 > 当没有匹配的文档时,为什么 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 中写东西会更精简......

标签: mongodbperformance

解决方案


这是在JS中吗?db.getCollection("users").find(看起来它应该返回一个 Promise,并且 Promise 没有长度,所以被门控的更新代码ids.length永远不会运行。


推荐阅读