Javascript 如何处理for循环中nodejs的回调函数?
我的猫鼬模式是Javascript 如何处理for循环中nodejs的回调函数?,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我的猫鼬模式是 skills : [ { name : {type : String}, count : {type :Number, default:0} } ] 我正在使用for循环触发更新查询,因为我想更新文档数组,而我的查询是 for(var i=0;i<array.length;i++){ Talent.update({userName : userName}, {$addToSe
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(var i=0;i我想你需要这样的东西:
var update = function(callback) {
var result = {};
var len = array.length;
var done = 0;
for (var i = 0; i < len; i++) {
Talent.update({
userName: userName
}, {
$addToSet: {
skills: {
$each: [{
name: array[i]
}]
}
}
}, function(err, talent) {
result[i] = {
err: err,
talent: talent
};
done++;
if (done === len)
callback(result);
});
}
};
无论如何,我没有测试它,所以它可能有一些问题。我想你需要这样的东西:
var update = function(callback) {
var result = {};
var len = array.length;
var done = 0;
for (var i = 0; i < len; i++) {
Talent.update({
userName: userName
}, {
$addToSet: {
skills: {
$each: [{
name: array[i]
}]
}
}
}, function(err, talent) {
result[i] = {
err: err,
talent: talent
};
done++;
if (done === len)
callback(result);
});
}
};
无论如何,我没有测试它,所以它可能有一些问题。我想你需要这样的东西:
var update = function(callback) {
var result = {};
var len = array.length;
var done = 0;
for (var i = 0; i < len; i++) {
Talent.update({
userName: userName
}, {
$addToSet: {
skills: {
$each: [{
name: array[i]
}]
}
}
}, function(err, talent) {
result[i] = {
err: err,
talent: talent
};
done++;
if (done === len)
callback(result);
});
}
};
无论如何,我没有测试它,所以它可能有一些问题。我想你需要这样的东西:
var update = function(callback) {
var result = {};
var len = array.length;
var done = 0;
for (var i = 0; i < len; i++) {
Talent.update({
userName: userName
}, {
$addToSet: {
skills: {
$each: [{
name: array[i]
}]
}
}
}, function(err, talent) {
result[i] = {
err: err,
talent: talent
};
done++;
if (done === len)
callback(result);
});
}
};
无论如何,我没有测试它,所以它可能有一些问题。这看起来确实像是你只要求修改一个文档,但如果你目前正在循环更新,你不需要这样做
此外,您还需要修改的结果,它实际上属于这样的方法,因为该表单返回修改过的文档。.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
}
);
在最后一种情况下,修饰符接受一个数组参数,因此只需重新调整原始数组中的输入参数,使其与更新实际文档时预期的结构相匹配
还有其他方法可以处理串行循环,但在这种情况下,您似乎不需要它。这看起来确实像是您只要求修改一个文档,但如果您当前正在循环更新,则不需要这样做
此外,您还需要修改的结果,它实际上属于这样的方法,因为该表单返回修改过的文档。.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
}
);
在最后一种情况下,修饰符接受一个数组参数,因此只需重新调整原始数组中的输入参数,使其与更新实际文档时预期的结构相匹配
还有其他方法可以处理串行循环,但在这种情况下,您似乎不需要它。这看起来确实像是您只要求修改一个文档,但如果您当前正在循环更新,则不需要这样做
此外,您还需要修改的结果,它实际上属于这样的方法,因为该表单返回修改过的文档。.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
}
);
在最后一种情况下,修饰符接受一个数组参数,因此只需重新调整原始数组中的输入参数,使其与更新实际文档时预期的结构相匹配
还有其他方法可以处理串行循环,但在这种情况下,您似乎不需要它。这看起来确实像是您只要求修改一个文档,但如果您当前正在循环更新,则不需要这样做
此外,您还需要修改的结果,它实际上属于这样的方法,因为该表单返回修改过的文档。.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
}
);
在最后一种情况下,修饰符接受一个数组参数,因此只需重新调整原始数组中的输入参数,使其与更新实际文档时预期的结构相匹配
有其他方法可以处理串联循环,但在这种情况下,您似乎不需要它。一般问题似乎很清楚,但这里不清楚的是在“技能”中的文档下使用“计数”字段数组。你不在更新中引用它,那么你的意图是什么?我不是在处理count。问题是我想要在循环完成时调用回调函数。回调应该返回执行查询的结果。一般的问题似乎很清楚,但这里不清楚的是“count”的用法“技能”中文档下的字段数组。你不在更新中引用它,那么你的意图是什么?我不是在处理count。问题是我想要在循环完成时调用回调函数。回调应该返回执行查询的结果。一般的问题似乎很清楚,但这里不清楚的是“count”的用法“技能”中文档下的字段数组。你不在更新中引用它,那么你的意图是什么?我不是在处理count。问题是我想要在循环完成时调用回调函数。回调应该返回执行查询的结果。一般的问题似乎很清楚,但这里不清楚的是“count”的用法“技能”中文档下的字段数组。你在更新中没有引用它,那么你的意图是什么?我不是在处理计数。问题是我想在循环完成时调用回调函数。回调应该返回执行查询的结果。谢谢你的帮助和代码。这对我帮助很大。谢谢。@SaurabhGhewari我很感兴趣。突然,这并不能解决问题我们的问题到底如何?它不能解决您没有正确指定的问题吗?为什么要删除accept?感谢您的帮助和代码。它帮助了我很多。谢谢。@SaurabhGhewari我很好奇。突然,这不能解决您的问题到底如何?它不能解决您失败的问题吗