Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Mongoose save()不更新数据库文档中数组中的值_Arrays_Node.js_Mongodb_For Loop_Mongoose - Fatal编程技术网

Arrays Mongoose save()不更新数据库文档中数组中的值

Arrays Mongoose save()不更新数据库文档中数组中的值,arrays,node.js,mongodb,for-loop,mongoose,Arrays,Node.js,Mongodb,For Loop,Mongoose,我试图使用GUI更新集合(单位)中的文档,更新后,我想更新集合(用户)中的值(user.units,它是单位名称的数组)。如果数组长度仅为1个元素,它将得到更新,并显示在数据库中,并且一切正常,但当单元数组有多个元素时,我尝试通过for循环进行更新,它将显示它已更新,但当我检查数据库时,它仍然没有更新 当我通过循环更新值时,我真的不明白为什么不更新数据库 整个编辑和更新功能:- edit_unit: function (req, res, next) { var Data = req.

我试图使用GUI更新集合(单位)中的文档,更新后,我想更新集合(用户)中的值(user.units,它是单位名称的数组)。如果数组长度仅为1个元素,它将得到更新,并显示在数据库中,并且一切正常,但当单元数组有多个元素时,我尝试通过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);
        }
    });
}
{ 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 });
用户模式:-

 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);
        }
    });
}
{ 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 });

可能会通知Mongoose数据集已更改如下:

doc.markModified('pathToYourAttribute') 
从文件中

希望有帮助

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

doc.array.set(index, value);
而不是

doc.array[index] = value;

另请查看和以了解更多详细信息。

我用以下语句替换了保存方法:
Client_data.Unit.updateOne({u id:Unit.\u id},Unit)

您是否可以编辑您的问题,将
用户的模式定义包括在内?“PathToYourAttribute”是什么?很抱歉,我对mongoose有点陌生。@SungWonCho我想递归更新所有嵌套引用(如果它们没有更改)的内存位置是一个不必要的昂贵查询。我很惊讶它在文档中不是最前面和最中间的。。也许我错过了!谢谢,这帮了大忙。mongoose文档中的仅供参考——内置日期方法没有连接到mongoose更改跟踪逻辑中,在英语中,这意味着如果您在文档中使用日期并使用setMonth()之类的方法对其进行修改,mongoose将不知道此更改,doc.save()将不会保留此修改。如果必须使用内置方法修改日期类型,请在保存之前使用doc.markModified('pathToYourDate')告诉mongoose有关更改的信息。这不适用于对象数组,这是OP的情况。有什么修改吗?