如何在没有拯救舞蹈的情况下保存猫鼬的联想?

时间:2013-11-02 03:02:07

标签: node.js mongoose

说我有这个架构。

   var Topic = new Schema({
        owner: {
            type: Schema.Types.ObjectId,
            ref: 'User'
        },
        category: {
            type: Schema.Types.ObjectId,
            ref: 'Category'
        },
        title: String,
        date: Date,
        lastPost: Date,
        likes: Number,
        posts: [{
            type: Schema.Types.ObjectId,
            ref: 'Post'
        }]
    });

    var Post = new Schema({
        topic: {
            type: Schema.Types.ObjectId,
            ref: 'Topic'
        },
        body: String,
        date: Date,
        owner: {
            type: Schema.Types.ObjectId,
            ref: 'User'
        }
    });

如果我想保存主题然后将主题添加到帖子上的主题关联,然后推送到主题对象上的posts数组,我必须做这个奇怪的舞蹈。

exports.create = function (req, res) {

    var data = req.body.data;

    var topic = new Topic();
    topic.title = data.topic.title;
    topic.date = new Date();
    topic.lastPost = new Date();

    topic.save(function (err, topicNew) {

        if (err) res.send(err, 500);

        var post = new Post();
        post.body = data.post.body;
        post.topic = topicNew;

        topicNew.posts.push(post);

        topic.save(function (err, t) {

            if (err) res.send(err, 500);
            post.save(function (err, p) {
                if (err) res.send(err, 500);
                return res.json(t);
            });
        });
    });
};

我在文档中没有看到任何可以帮助我解决这个问题的内容。谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

最初实例化主题和帖子。在第一个主题保存之前将帖子推送到主题中。然后保存主题,如果成功保存帖子。当您执行new Post()时,驱动程序会立即创建MongoDB对象ID,以便您可以在保存之前将其保存在topic.posts数组中。

这将使你的3步舞蹈成为一个两步舞蹈,但在宏伟的计划中,这似乎与课程基本相同,所以我不会将我的期望设定得比这低得多。使用单个DB命令可以实现很少有用的真实路由。

您还可以使用中间件功能来获取顺序异步操作而无需嵌套。您可以使用req对象存储中间结果,并将它们从一个中间件传递到下一个中​​间件。