for循环查询

时间:2016-05-16 15:20:09

标签: javascript node.js node-postgres

我在mongo中有这个:

min()

我在postgresql中做了这个:

//fill QueryString
collection.find({"myID" : {$in:QueryString} },{}).toArray(function(err, Stuff) { 
... 
var flag = true;
for (var i=0; i<Stuff.length; i++) {

    //if statements .. alter flag
    // if Stuff[i].myField....
}

if (req.body.type == "myField") {

collection.update(
  { "my_id" : req.body.id },
  {$set : { "myField" : req.body.fileid }}, 
  function(err, result) {
  ....

 }

但是,for循环在postgres中没有像预期的那样工作。 我不确定如何在查询中使用for循环。

问题是每个循环的标志都是假的,但它应该是真的。

===============使用pg-promise ============================ =======

pg.connect(conString, function(err, client, done) {

        if (err) return console.error('error fetching client from pool', err);

        client.query( "SELECT * FROM mytable WHERE my_id = ANY ($1::varchar[])  ",[QueryString], function(err,Stuff) {


            var flag = true;
            for (var i=0; i<Stuff.rows.length; i++) {
             ...
            //if statements .. alter flag
            if (typeof(Stuff.rows[i].myField) === 'undefined' || ( (typeof(Stuff.rows[i].myField) !== 'undefined' && Stuff.rows[i].myField.length < 16 ) )) {

              if (req.body.my_ids[i] === req.body.id && req.body.type === "myField") {

              }else{
                flag = false;
              }
          }
            debug('flag:'+flag);              

}//end of for loop



 if (req.body.type === "anotherField") {

        client.query("UPDATE mytable  SET anotherField ='req.body.fileid' WHERE my_id = 'req.body.id'",  function(err, result)  {
    ....

    });//endof update

done();
});//end of first query

通过这种方法,我仍然处于初期问题。 标志是false而不是true(关于mongo)。

最后,我不确定关于 dbPromise.tx(function (t) { return t.any("SELECT * FROM mytable WHERE my_id = ANY ($1::varchar[]) ",[QueryString]) .then(function (Stuff) { var flag = true; for (var i = 0; i < Stuff.length; i++) { ...//if statements if (typeof(Stuff[i].myField === ....) ... } //end of for loop var queries = Stuff.map(function (d) { if (req.body.type === "myField") { return t.none("UPDATE mytable SET myField ='req.body.fileid' WHERE my_id = 'req.body.id'") debug("success: "+req.body.id); res.send({ user : req.user, message : "SUCCESS", my_id : req.body.id}); } else if (req.body.type === "anotherField") { .... } }); return t.batch(queries); }) }) .then(function (Stuff) { //this is executed for every single update ,right? console.log("Hurrah!"); }) .catch(function (error) { console.log("ERROR:", error.message || error); }); 的{​​{1}}。我应该使用Stuff.map(function (d)吗?如果我有很多像我这样的字段?

1 个答案:

答案 0 :(得分:-1)

为了完成您的示例,您应该使用事务进行多次更新,以保持数据的完整性。

这是使用事务pg-promise完成整个过程的方式:

db.tx(function (t) {
    return t.any("SELECT * FROM myTable WHERE my_id = ...", [params])
        .then(function (data) {
            var queries = data.map(function (d) {
                if (/*need to update*/) {
                    // do any checks or manipulations for 'd';
                    return t.none("UPDATE myTable SET ...", [params])
                }
            });
            return t.batch(queries);
        })
})
    .then(function (data) {
        // all updates were successful;
        console.log("Hurrah!");
    })
    .catch(function (error) {
        // something failed;
        console.log("ERROR:", error.message || error);
    });