说我有这个架构。
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);
});
});
});
};
我在文档中没有看到任何可以帮助我解决这个问题的内容。谢谢你的帮助。
答案 0 :(得分:2)
最初实例化主题和帖子。在第一个主题保存之前将帖子推送到主题中。然后保存主题,如果成功保存帖子。当您执行new Post()
时,驱动程序会立即创建MongoDB对象ID,以便您可以在保存之前将其保存在topic.posts数组中。
这将使你的3步舞蹈成为一个两步舞蹈,但在宏伟的计划中,这似乎与课程基本相同,所以我不会将我的期望设定得比这低得多。使用单个DB命令可以实现很少有用的真实路由。
您还可以使用中间件功能来获取顺序异步操作而无需嵌套。您可以使用req
对象存储中间结果,并将它们从一个中间件传递到下一个中间件。