推送到参考模型后如何保存?

时间:2014-06-22 15:15:08

标签: mongoose

在将数据推送到模块后尝试保存模型时遇到问题: 这是Schemas:

var ClientSchema = new Schema({
    email: {type: String, required: '{PATH} is required!', unique: 'This email already exists!'},
    name: String,
    nick: String,
    domains: [{ type: Schema.Types.ObjectId, ref: 'Domain' }],
    hosting: [{ type: Schema.Types.ObjectId, ref: 'Hosting'}]
});

var DomainSchema = new Schema({
    name: {type: String, required: '{PATH} is required'},
    startDate: {type: Date, required: '{PATH} is required'},
    endDate: {type: Date, required: '{PATH} is required'},
    realPrice: {type: Number, required: '{PATH} is required'},
    billedPrice: {type: Number, required: '{PATH} is required'}
});

并且这是控制器的一部分:

...

         Client.findOne({_id: req.params.client_id},function(err,client) {

            var domain = new Domain({
                name: req.body.name,
                startDate: req.body.startDate,
                endDate: req.body.endDate,
                realPrice: req.body.realPrice,
                billedPrice: req.body.billedPrice
            });
            domain.save(function(err) {
                console.log(domain._id);
            });
                        cli.domains.push(domain._id);
            client.save(function(err,cli) {

                // That's the one that makes it possible to save
                // client.save();
            });

            res.redirect("/"); 
        });

...

现在, 如果我将其保留为一个client.save(..),则会保存域名,但是会推送该域名,但不会保存客户端。 如果我取消注释另一个client.save(),一切都会保存(我猜)。 那么问题又是什么,为什么我需要保存两次? 我想念这里真的很简单吗? 不要误解我 - 它有效,但我只需要了解它;) 感谢您的帮助。


更新/解决方案

我遇到的所有问题都是因为我的ubuntu机器上安装了较旧的(2.4.9)mongodb版本,并且与mongodb使用的文档版本存在冲突。我在另一台机器上检查了相同的代码,一切正常。那是什么让我重新检查并安装了更新的mongodb以及清理实际的数据库,这使得一切都应该如此 - 当然 - 工作;)

1 个答案:

答案 0 :(得分:0)

Mongodb本质上是异步的。您需要在domain.save的回调下移动client.save()。 For more help

Client.findOne({_id: req.params.client_id},function(err,client) {

    var domain = new Domain({
        _client: client.id,
        name: req.body.name,
        startDate: req.body.startDate,
        endDate: req.body.endDate,
        realPrice: req.body.realPrice,
        billedPrice: req.body.billedPrice
    });

    domain.save(function(err, result) {
        client.domains.push(result._id);
        client.save();
    });

    res.redirect("/"); 
});

修改

我已经快速尝试了您的查询,它对我来说很好。

选中此Sample Code Snippet