2016-05-16 2 views
-1

У меня есть это в Монго:цикл внутри запроса

//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 

Но для цикла не работает, как ожидается, в Postgres. Я не уверен, как использовать цикл в запросе.

Проблема в том, что флаг i каждый цикл является ложным, но он должен быть правдой.

Использование ============== ========

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

При таком подходе я все еще в своей первоначальной проблеме. Флаг является ложным вместо истинного (с учетом монго).

Наконец, я не уверен насчет Stuff.map(function (d), о d. Вместо этого я использую myField? И если у меня есть много полей, как я?

+0

Он должен работать, как у вас есть. Я бы установил точку останова в строке 'var flag = true', чтобы убедиться, что вы возвращаете что-либо в Stuff, как ожидалось, или если что-то не так с вашим запросом. – Paul

+0

@Paul: Хорошо, слышу, что для циклов используются как this.I обновил мой код. Проблема в том, что флаг i каждый цикл является ложным, но он должен быть true.I есть другой запрос также (внутри первого). Я не уверен, что это проблема? Я использую 'done()' только при завершении первого запроса. Спасибо. – George

+1

@George, вы должны использовать 'done' после завершения всех запросов. –

ответ

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

@ vital- t: Спасибо за код. Но я не могу понять, где мой цикл for (внутри первого запроса y и до второго), и, например, у меня есть 'if (req.body.type ===" anotherField ") { client.query (" UPDATE mytable SET anot .... "и после этого оператора if, У меня есть другой 'if (req.body.type ===" differentField ") { client.query (" UPDATE mytable SET ... ". Как они следуют вашему примеру? – George

+0

@George вы можете добавить любое условие внутри 'data.map (function (d) {' callback. Я обновил пример;) –

+0

: Я обновил сообщение, используя ваше решение. У меня все еще такая же начальная проблема. Флаг - false вместо true (при сравнении с mongo) .Также, в выражении 'then', он выполняется для каждого запроса обновления sinngle, правильно? Как насчет ошибки? Где я должен поместить сообщение для этого? (для каждого запроса на обновление) . '' Catch' для ошибки во всем запросе, верно? Наконец, я не уверен в 'Stuff.map (function (d)', о 'd'. Вместо этого я должен использовать' myField'? И если у меня много полей? – George

Смежные вопросы