我有以下代码,找到包含输入电子邮件地址的成员的所有项目。我们的想法是搜索NFtest@test.com(作为示例)并将其更改为输入的名称。
有问题的代码
Project.find({ _members: req.body.email }, function(err, projects) {
for (var i = 0, len = projects.length; i < len; i++) {
for (var x = 0, lent = projects[i]._members.length; x < lent; x++) {
if (projects[i]._members[x] == ["NF" + req.body.email]) {
console.log("FOUND MATCH")
projects[i]._members[x].value = req.body.alias
projects[i].save()
}
}
}
控制台日志告诉我已找到匹配项,但数组中的值永远不会更新。我想知道是否有一个正确的方法来更改数组中的值而不是仅使用=运算符。或者我没有正确保存文件?
示例项目文档
"_id" : ObjectId("5546"),
"name" : "Test project",
"description" : "This is a sample description",
"archived" : false,
"admins" : [
"test@test.com"
],
"_members" : [
"membertoupdate@test.com",
"NFmembertoupdate@test.com"
],
"updated" : ISODate("2015=05=04T04:52:22:787Z")
想法是用名称更新NFmembertoupdate@test.com。这个名字来自req.body.alias。
控制台告诉我找到了一个匹配项并且没有抛出任何错误,但是没有进行更新。
答案 0 :(得分:0)
问。为什么我直接更新元素时不会保存对数组的更改?
doc.array[3] = 'changed';
doc.save();
A。 Mongoose不会为数组索引创建getter / setter;如果没有它们,mongoose永远不会收到有关更改的通知,因此不知道如何保留新值。解决方法是使用Mongoose&gt; = 3.2.0中提供的MongooseArray #set。
// 3.2.0
doc.array.set(3, 'changed');
doc.save();
// if running a version less than 3.2.0, you must mark the array modified before saving.
doc.array[3] = 'changed';
doc.markModified('array');
doc.save();