【问题标题】:for loop inside query查询内的for循环
【发布时间】:2016-05-17 15:12:14
【问题描述】:

我在 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) {
  ....

 }

我在 postgresql 中做到了这一点:

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

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

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

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

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

使用这种方法,我仍然处于最初的问题中。 该标志是 false 而不是 true (关于 mongo )。

最后,我不确定Stuff.map(function (d),关于d。我应该改用myField吗?如果我有很多像我一样的字段?

【问题讨论】:

  • 它应该可以正常工作。我会在 var flag=true 行设置一个断点,以查看您是否按预期返回了 Stuff 中的任何内容,或者您​​的查询是否有问题。
  • @Paul: 好的,很高兴听到这样使用 for 循环。我更新了我的代码。问题是每个循环的标志都是假的,但它应该是真的。我有另一个查询也(在第一个里面)。我不确定这是否是问题?我只在完成第一个查询时使用done()。谢谢。
  • @George 你应该在所有查询完成后使用done
  • 你说循环没有按预期工作,但你没有说它实际上做了什么。
  • @vitaly-t: 我不应该在第一个查询的}); 之前使用done() 吗?(在第一个查询中?)。我还尝试在完成查询时将其放在 }); 之外(并且仍在 pg.connect 内,但它没有完成工作(继续运行)

标签: javascript node.js node-postgres


【解决方案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);
    });

【讨论】:

  • @vital-t:感谢您的代码。但是,我不知道我的 for 循环在哪里(在第一个查询内和第二个查询之前),例如,我有 if (req.body.type === "anotherField") { client.query("UPDATE mytable SET anot.... 和在这个 if 语句之后,我还有另一个 if (req.body.type === "differentField") { client.query("UPDATE mytable SET ...。这些如何效仿你的例子?
  • @George 您可以在data.map(function (d) { 回调中添加任何条件。我已经更新了示例;)
  • :我使用您的解决方案更新了我的帖子。我仍然有相同的初始问题。标志是假而不是真(使用 mongo 进行比较)。此外,在then 语句中,它被执行对于每个单一的更新查询,对吗?一个错误怎么样?我应该在哪里放一条消息?(对于每个更新查询)。catch 是整个查询中的错误,对吧?最后,我不确定关于 ` Stuff.map(function (d),about the d.Should I use myField` 而不是?如果我有很多字段?
  • @George 你需要努力自己做出小的改变。使用 StackOverflow 让别人为你编写所有代码并不适合你。
  • :但是,我正在写代码。另外,只是,之前没有nodejs,javascript,数据库的经验,即使是小的变化也很难!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多