若不存在则插入,存在则更新,如何实现?
发布于 12 年前 作者 supersheep 4561 次浏览 最后一次编辑是 8 年前

需要更新的列表长度未知。 其他语言的话一个循环同步的写下来,非常容易。

用node写异步的就觉得比较忧伤了,我给出自己的做法,也看看大家遇到这样的需求是怎么做的。

var async = require("async");
var list = ["a", "b", "c"];
var tasks = [];
var result;

list.forEach(function(item) {
    tasks.push(function() {
        var qs = "select * from table where name=\"" + item + "\"";
        db.query(qs, function(err, rows) {
            var flag;
            if(err) {
                throw err;
            }
            if(rows[0]) {
                flag = true;
            } else {
                flag = false;
            };
            result = {
                id:rows[0].id || null,
                name: name,
                flag: flag
            };
        }
        done();
        })
    });
    tasks.push(function(done) {
        var qs;
        if(result.flag) {
            qs = "update table set name=\"" + result.name + "\" where id=" + result.id;
        } else {
            qs = "insert into table set name=\"" + result.name "\"";
        }
        db.query(qs, function() {
            done();
        });
    });
});

async.series(tasks);
3 回复

用MongoDB吧,它有upsert可以实现

用async咯,async.forEachSeries

嗯,是用async了,写漏了。突然意识到自己写复杂了。这个地方不用保存select的状态,直接把插入或更新操作写在查找的回调里就好了……

回到顶部