【发布时间】: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