【问题标题】:Mongoose saving for populate猫鼬保存填充
【发布时间】:2016-06-10 01:08:06
【问题描述】:

总的来说,我是 Mongoose 和 Nodejs 开发的新手,我对如何正确设置保存记录有点困惑。这是我的两个架构:

下载

var mongoose = require("mongoose");
var Schema = mongoose.Schema;

var downloadSchema = Schema({
    title        : String,
    description  : String,
    _project      : { type: Schema.Types.ObjectId, ref: 'Project' }
});

module.exports = mongoose.model('Download', downloadSchema);

项目

...

var projectSchema = Schema({
    name         : String,
    url          : String,
    pwd          : String,
    _downloads   : [{type: Schema.Types.ObjectId, ref: 'Download' }]
});

module.exports = mongoose.model('Project', projectSchema);

这似乎工作正常。该文档解释了我保存下载和链接项目的用例,但我不确定如何正确填充Project._downloads。这是我所做的:

快速路由处理程序:

function createDownload(req, res) {

    // the Project Id is passed in the req.body as ._project
    var dldata = req.body;

    Project.findOne({ _id : dldata._project }, function(err, project) {
        var dload = new Download(dldata);


        dload.save( function (err, download) {

            project._downloads.push(download._id);
            project.save( function(err){
                var msg = {};
                if(err) {
                    msg.status = 'error';
                    msg.text = err;
                }else {
                    msg.status = 'success';
                    msg.text = 'Download created successfully!';
                }

                res.json(msg);
            });

        });
    });
}

这对我来说似乎过于复杂了。我应该手动pushing 到._downloads 数组,还是猫鼬应该根据架构在内部处理?有没有更好的方法来实现它,以便我可以做到:

Download.find().populate('_project').exec( ...

还有:

Project.findOne({_id : _projectId}).populate('_downloads').exec( ...

【问题讨论】:

    标签: node.js express mongoose mongoose-populate mongoose-schema


    【解决方案1】:

    根据mongoose docs,有两种方法可以将子文档添加到父对象:

    1) 使用 push() 方法

    2) 使用 create() 方法

    所以我觉得你的代码可以通过省去保存新下载项的操作来简化一点:

    function createDownload(req, res) {
        var dldata = req.body;
    
        Project.findOne({ _id : dldata._project }, function(err, project) {
            // handle error
    
            project._downloads.push(dldata);
    
            project.save(function(err) {
                // handle the result
            });
        });
    }
    

    function createDownload(req, res) {
        var dldata = req.body;
    
        Project.findOne({ _id : dldata._project }, function(err, project) {
            // handle error
    
            project._downloads.create(dldata);
    
            project.save(function(err) {
                // handle the result
            });
        });
    }
    

    【讨论】:

    • 谢谢!一旦我将._downloads 的项目模式修改为:_downloads : [Download.schema],它就像一个魅力。我什至不了解子文档,因此也感谢您为我指明了正确的方向。
    • 很高兴能帮上忙!
    猜你喜欢
    • 2012-11-11
    • 1970-01-01
    • 2020-05-09
    • 2015-04-01
    • 2014-09-06
    • 2015-07-13
    • 2016-10-10
    • 2019-09-16
    相关资源
    最近更新 更多