【问题标题】:Mongoose save() not updating value in an array in database documentMongoose save() 不更新数据库文档中数组中的值
【发布时间】:2014-08-28 09:46:26
【问题描述】:

我正在尝试使用 GUI 更新集合(单元)中的文档,并且在更新后我想更新集合(用户)中的值(user.Units,它是单元名称的数组)。如果数组长度只是 1 个元素,它会被更新并显示在数据库中并且一切正常,但是当 Array of Units 有多个元素时,我尝试通过 for 循环更新它,它显示它已更新但当我检查了数据库,它仍然没有更新。

当我通过循环更新值时,我真的不明白为什么它不更新数据库。

整体编辑更新功能:-

 edit_unit: function (req, res, next) {
    var Data = req.body;

    Client_data.Unit.findById(req.params.unitId, function (err, unit) {
        var error = false;
        if (err) {
            error = err;
        } else if (!unit) {
            error = "FATAL: unable to look up Unit #" + req.params.unitId;
        } else {

            switch(req.body.name) {
                case 'Icon':
                    var Icon = unit.Icon;

                    User.find({"Units":Icon}, function (err, users) {
                        if (err)
                        console.log(err);

                        users.forEach(function (u) {
                            if (u.Units.length > 1) {
                            for (var i = 0; i <= u.Units.length; i++) {
                               if(u.Units[i] == Icon) {
                                   u.Units[i] = req.body.value;
                               }
                            }
                            }
                            else {
                                u.Units = req.body.value;
                            }
                            u.save(u);
                        });
                    });
                    unit[req.body.name] = req.body.value;
                    break;
                case 'Description':
                    unit[req.body.name] = req.body.value;
                    break;
                default:
                    unit[req.body.name] = req.body.value;
                    break;
            }
            var data = JSON.stringify(req.body);
            unit.save();

            res.writeHead(200, {
                'Content-Length': data.length,
                'Content-Type':  'application/json'
            });
            res.end(data);
        }
    });
}

req.body:-

{ name: 'Icon',
  value: 'Health Utility 22c',
  pk: '5395ed107cd92dc40eaafb56' 
}

用户架构:-

var userSchema = mongoose.Schema({
UserName:     { type: String, required: true },
Password:     { type: String },
FirstName:    { type: String, required: true },
LastName:     { type: String, required: true },
CompanyName:  { type: String },
PhoneNumber:  { type: Number },
StartDate:    { type: Date,   required: true },
EndDate:      { type: Date,   required: true, default: new Date('9999-12-12')  },
ClientID:     { type: ObjectId, ref: 'Client', default: null },
DepartmentID: { type: ObjectId, ref: 'Department' },
ManagerID:    { type: ObjectId, ref: 'User', default: null},
Units:        [ { type: String, required: true } ],
UserList:      { type: Array, default:[]},
Access:    [{ type: String, enum: ['DEMO', 'USER','MANAGER','ADMINISTRATOR','OWNER']}],
Credentials:  { type: String },
AFTE:         { type: Number},
SessionID:    { type: String, default: null }
}, { safe: true });

【问题讨论】:

  • 您能否编辑您的问题以包含User 的架构定义?

标签: arrays node.js mongodb for-loop mongoose


【解决方案1】:

也许通知 mongooose 数据集发生了这样的变化:

doc.markModified('pathToYourAttribute') 

来自文档http://mongoosejs.com/docs/schematypes.html

person.anything = { x: [3, 4, { y: "changed" }] }; 
person.markModified('anything');

希望对你有帮助!

【讨论】:

  • 什么是“PathToYourAttribute”?,对不起,我对猫鼬有点陌生。
  • @SungWonCho 我认为递归更新所有嵌套引用的内存位置(如果它们没有更改)是一个不必要的昂贵查询。我很惊讶它不在文档的前面和中心。也许我错过了!
  • 谢谢,这帮助很大。来自 mongoose 文档的仅供参考 --- 内置 Date 方法未连接到 mongoose 更改跟踪逻辑中,这在英文中意味着如果您在文档中使用 Date 并使用 setMonth() 之类的方法对其进行修改,mongoose 将不知道此更改和 doc.save() 不会保留此修改。如果您必须使用内置方法修改 Date 类型,请在保存之前使用 doc.markModified('pathToYourDate') 告诉 mongoose 更改
【解决方案2】:

请参阅this issue。解决此问题的一种方法是不要通过经典的数组索引方法更新您的数组。所以这样做

doc.array.set(index, value);

而不是

doc.array[index] = value;

还可以查看FAQdoc 了解更多详情。

【讨论】:

  • 这不适用于对象数组,这是 OP 的情况。有什么修改吗?
【解决方案3】:

我用这个语句替换了保存方法:

Client_data.Unit.updateOne({_id: unit._id},unit);

【讨论】:

    猜你喜欢
    • 2016-02-05
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 2016-11-19
    相关资源
    最近更新 更多