我的mongoose集合如下所示:
集合名称:test
[
{
_id: xxx,
alerts: {
level1 : {
list: [ {'name': 'John'},{'name':'balm']
}
}
},
{
_id: yyy,
alerts: {
level1 : {
list: [ {'name': 'cindy'},{'name':'terry']
}
}
},
]
我正在编写一个函数,它将在列表的名称字段中找到所有'Johns',并将其替换为'Joan'。
到目前为止,我有以下脚本:
var mongoose = require('mongoose'),
,testModel = mongoose.model('test');
testModel.find(query, function(err,docs){
docs.forEach(function(doc){
if(doc.alerts.level1.list.length>0) {
var nameChagned = false;
doc.alerts.level1.list.forEach(function(obj){
if(obj.name === 'John') {
obj.name = 'Joan';
namechanged = true;
}
}
if(nameChanged) { doc.save();}
}
}
}
在检查集合时脚本结束时,值不会更新。 我可以在这里找到什么线索?
谢谢,
答案 0 :(得分:0)
在上面的源代码中,您永远不会更新nameChanged
变量,因此永远不会运行doc.save()
命令。您将在行namechanged = true
中引入一个全局变量(请注意,JavaScript变量区分大小写)。在声明中,您使用变量名nameChagned
,因此nameChanged
变量始终计算为假值。
对doc.save()
方法使用回调也是一种好习惯:
doc.save(function (err, doc, numberAffected) {
if (err) {
return handleError(err);
}
});
因此,您可以处理保存文档时发生的任何错误。请参阅Mongoose Docs for Model#save。
您还应该检查要传递给查找功能的query
。也许您没有找到任何文档,因此docs
参数为空。