【问题标题】:Issue implementing a Mongoose PUT for a custom object into a complex schema将自定义对象的 Mongoose PUT 实现为复杂模式的问题
【发布时间】:2016-07-08 01:09:18
【问题描述】:

我会分解问题以确保我已经很好地解释了它。

我的 Web 应用程序使用 MEAN.js,在这种情况下,我正在 mongoose 服务器端控制器中实现更新功能。 使用此架构:

客户端角度控制器代码工作正常,它正在向我发送正确的对象以将其插入 mongodb

我有一个由数据库中其他相关模式对象组成的自定义对象数组,它表示引用任务对象的更新列表、Taskstate 对象的更改以及发生更新的时间。

 tupdates:[{
        task:{
          type: Schema.ObjectId,
          ref: 'Task'
        },
        tstate:{
          type: Schema.ObjectId,
            ref: 'Tstate'
        },
        startedat: Date,
        stoppedat: Date,
        updatedby:{
            type: Schema.ObjectId,
            ref: 'User'
        },
    }]

我实现了一个函数,它将遍历 req 对象中的数组,并为数组中的每个更新创建自定义对象,最后将其插入数据库中。 服务器端猫鼬控制器

var mongoose = require('mongoose'),
Job = mongoose.model('Job');
    exports.update = function(req, res){
    var job = req.job;

    //check for updates
    if(req.body.tupdates.length>0){
    for (var j=0; j<req.body.tupdates.length; j++){

        var theobj = req.body.tupdates[j];
        var tupdate = ({
           task : theobj.task._id,
            tstate: theobj.tstate._id
        });
job.tupdates.push(tupdate);
        }
    }
    job.save(function(err){
        if(err){
            return res.status(400).send({
                message: getErrorMessage(err)
            });
        }else{
            res.json(job);
        }
    });
};enter code here

数据保存在数据库中,问题是在 req 数组中的每个更新中插入了一个带有我没有引用的 ObjectID 的附加 _id 值,如下所示:

db.jobs.find()
{ "_id" : ObjectId("56eff14d4b343c7f0a71f33c"), "creator" : ObjectId("55ddd115a2904424680263a0"), "title" : "Job1", "tupdates" : [ { "task" : ObjectId("567a9c4b90f3ccd10b0e7099"), "tstate" : ObjectId("5693bb0f804936f167fe9ec2"), *"_id" : ObjectId("56eff38e095a2fa41312d876")*} ]}

我添加了这些星号来指示带有 ObjectId 引用的 _id 值,该引用被添加到我在服务器端控制器中创建的对象中,每次我对同一对象进行更新时,问题仍然存在。它稍后会创建 500 个错误,并且必须省略该函数才能在生产中正常工作,我感谢您的帮助,认为这是我需要进行的 java 脚本调整。

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    默认情况下,如果数组元素是对象,mongoose 会将 _id 字段添加到数组元素中。 只需将 _id: false 添加到您的架构中即可:

        tupdates:[{
            _id: false,
            task:{
              type: Schema.ObjectId,
              ref: 'Task'
            },
            tstate:{
              type: Schema.ObjectId,
                ref: 'Tstate'
            },
            startedat: Date,
            stoppedat: Date,
            updatedby:{
                type: Schema.ObjectId,
                ref: 'User'
            },
        }]
    

    【讨论】:

    • 经过测试,第一次我PUT一个新的更新,它第二次插入一个null,如下所示
    • 它在第一次更新发生后自动添加一个null,如下所示, { "_id" : ObjectId("56f053cd7e4ca6602e208d91"), "title" : "job1", "tupdates" : [ { "task" :ObjectId(“567a9c6690f3ccd10b0e709a”),“tstate”:ObjectId(“5693bb0f804936f167fe9ec2”)},null,{“任务”:ObjectId(“567a9c4b90f3ccd10b0e7099”),“tstate”:ObjectId(“5693bb0f804936f167fe9ec2”) :[ObjectId(“567a9c4b90f3ccd10b0e7099”),ObjectId(“567a9c6690f3ccd10b0e709a”),ObjectId(“567a9c7f90f3ccd10b0e709b”)]}
    • 完全不同的问题。我不知道您要向阵列推送什么,所以我无法回答。但看起来你正在添加一个空值......但它肯定与_id: false参数无关
    • 我同意这是一个完全不同的问题,服务器端控制器中第 11 行的代码是正确更新的 PUT,但是在第二个请求中,我插入了一个空值,并在插入后破坏了或检索。我会尝试在代码中处理 null 对象,但我仍然不知道这个 null 是从哪里来的。
    • 用相关代码发布另一个问题,我会尽力帮助
    猜你喜欢
    • 2011-02-06
    • 2019-08-20
    • 2016-09-13
    • 2016-10-31
    • 2016-01-27
    • 1970-01-01
    • 2018-06-19
    • 2012-06-26
    • 2011-12-06
    相关资源
    最近更新 更多