Javascript for循环内部查询

Javascript for循环内部查询,javascript,node.js,node-postgres,Javascript,Node.js,Node Postgres,我在mongo有这个: //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 (re

我在mongo有这个:

//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) {
  ....

 }
//填充查询字符串
find({“myID”:{$in:QueryString},{}).toArray(函数(err,Stuff){
... 
var标志=真;

对于(var i=0;i为了完成您的示例,您应该使用一个事务进行多次更新,以保持数据的完整性

这就是如何使用事务完成整个事情:

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);
    });

它应该按您所拥有的那样工作。我会在
var flag=true
行设置一个断点,以查看您是否按预期从内容中返回了任何内容,或者您的查询是否有错误。@Paul:好的,很高兴听到for循环是这样使用的。我更新了代码。问题是每个循环的标志I都是false,但它应该是true。我还有另一个查询(在第一个查询中)。我不确定这是否是问题所在?我使用的是
done()
仅在完成第一个查询时使用。谢谢。@George您应该在所有查询完成后使用
done
。您说循环没有按预期工作,但没有说它实际工作了什么。@vitaly-t:我不应该在
}之前使用第一个查询的
done()
(在第一个查询内?).我还试着把它放在
}之外,当完成查询时(仍然在
pg.connect
中,但它没有完成作业(继续运行)@vital-t:谢谢代码。但是,我不知道我的for循环在哪里(在第一个查询中,在第二个查询之前),例如,我有
if(req.body.type==“anotherField”){client.query(“另一个更新mytable集…”
,在这个if语句之后,我有另一个
if(req.body.type==“differentitfield”){client.query(“更新mytable集…”
。它们如何遵循您的示例?@George您可以在
data.map(函数(d){
回调中添加任何条件。我已经更新了示例;):我使用您的解决方案更新了我的帖子。我仍然有相同的初始问题。Flag是false而不是true(使用mongo进行比较)。此外,在
then
语句中,它对每个single update查询都执行,对吗?一个错误如何?我应该将此消息放在哪里?(对于每个更新查询).catch
catch
是针对整个查询中的错误,对吗?最后,我不确定'Stuff.map(函数(d)'
,关于
d
。我应该改用
myField`吗?如果我有很多字段呢?@George你需要自己努力做一些小的修改。使用StackOverflow让别人来编写你所有的代码对你来说都不太好。但是,我正在编写代码。而且,我之前没有在nodejs、javascript、da方面的经验塔巴斯斯,即使是小小的改变也很难!
 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);
});
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);
    });