Javascript for循环内部查询
我在mongo有这个: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
//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查询都执行,对吗?一个错误如何?我应该将此消息放在哪里?(对于每个更新查询).catchcatch
是针对整个查询中的错误,对吗?最后,我不确定'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);
});