MongoDB 查询结果作为循环控制器

MongoDB query result as loop controller

我需要给对象字段分配随机数然后检查数据库中是否有这样的对象。如果不保存,则分配新的随机值并再次检查数据库,依此类推。我知道问题是由于同步引起的,我不知道如何解决。

while (controller = 0) {
    var x = Math.floor((Math.random() * 10) + 1);
    Model.findOne({'x': x}, function(err, result) {
        if (err) throw err;
        if (!err && !result) controller = 1;
        else controller = 0;
    });
}

注意:我不知道您案例的详细信息,但您的方法会显着降低性能。特别是随机数大 MAX_VALUE。

为了解决异步回调的问题,您可以定义一个函数并递归调用它:

function saveIfNotExists() {
    var x = Math.floor((Math.random() * 10) + 1);
    Model.findOne({'x': x}, function(err, result) {
        if (err) throw err;

        if (!result) {
            // save object here
        } else {
            saveIfNotExists();
        }
    });
}

使用 MongoDB 的更新插入怎么样?

基本上,如果文档存在则执行更新,否则插入一个新文档。如此有效,您可以将文档的 属性 更新为自身(如果存在),否则,如果该值尚不存在,则将其作为新文档插入。

我无法评论 upsert 的性能,但我认为一次数据库命中比第一次检查存在然后第二次执行插入所需的两次更好。