2

假设我有这个架构。

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

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

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

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

4

1 回答 1

3

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

这将使你的 3 步舞变成 2 步舞,但从总体上看,这似乎与课程基本相同,所以我不会将我的期望设定得比这低得多。很少有有用的现实世界路线可以用单个 DB 命令实现。

您还可以使用中间件函数作为一种无需嵌套即可获得顺序异步操作的方法。您可以使用该req对象来存储中间结果并将它们从一个中间件传递到下一个中​​间件。

于 2013-11-02T06:03:20.333 回答