如何在没有保存舞蹈的情况下将协会保存在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' } }); 

如果我想保存主题,然后将主题添加到post上的主题关联,然后推送到主题对象上的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); }); }); }); }; 

我没有看到任何帮助我解决这个问题的文档。 谢谢你的帮助。

最初实例化主题和post。 在第一个主题保存之前将post推入主题。 然后保存该主题,如果成功保存post。 MongoDB对象ID由驱动程序在创buildnew Post()时创build,因此可以在保存之前将其保存在topic.posts数组中。

这将使你的三步跳舞成为两步跳舞,但是在这个macros伟的项目中,这个过程看起来基本上是相同的,所以我不会把我的期望设置得比这更低。 用一个DB命令就可以实现很less有用的真实世界路由。

您还可以使用中间件function作为获取顺序asynchronous操作而不嵌套的方法。 您可以使用req对象来存储中间结果,并将它们从一个中间件传递到下一个中​​间件。