我的 Mongoose 架构是
skills : [
{
name : {type : String},
count : {type :Number, default:0}
}
]
我正在使用 for 循环触发更新查询,因为我想更新文档数组,我的查询是
for(var i=0;i<array.length;i++){
Talent.update({userName : userName}, {$addToSet: {skills :{$each: [{name : array[i]}]}}},callback);
}
这里回调会在每次更新查询被触发时返回。我只想在 for 循环完成时使用数据库结果进行回调一次。 我该怎么办?
最佳答案
这看起来确实像是您要求仅修改一个文档,但如果您当前正在循环更新,则不需要这样做。
您还要求修改后的结果,该结果实际上属于 .findOneAndUpdate()
之类的方法,因为该表单返回修改后的文档。 .update()
形式可以应用于多个文档,因此不会在结果中返回修改后的内容:
所以它看起来确实像而不是循环,那么您需要做的就是“重新塑造”您的输入数组:
var array = ["Tennis","Football"];
array = array.map(function(x) {
return { "name": x };
});
// array is now [{ "name": "Tennis" }, { "name": "Football" }]
Talent.findOneAndUpdate(
{ "userName": userName },
{
"$addToSet": { "skills": { "$each": array } }
},
function(err,doc) {
if (err) throw err;
// doc contains all array members added
console.log( JSON.stringify( doc, undefined, 4) );
callback(); // Your outer callback
}
);
$each
修饰符在最后一种情况下采用数组参数,因此只需重新调整原始数组中的输入参数以匹配更新实际文档时所需的结构即可。
还有其他方法可以处理串行执行循环,但在这种情况下您似乎不需要它。
关于javascript - 如何处理for循环中nodejs的回调函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24858730/