我的情况是,我的用户有N个地址和N个联系信息,这些信息存储在不同的收藏中。
我应该将它存放在同一个系列中吗?如果没有,我怎样才能使下面的代码工作?
请记住,Mongoose查询是Asyn,因此,即使第一个地址被推送到他的模型中,用户也可以保存。
view
答案 0 :(得分:0)
不确定_postData
的来源,但您可能希望从req
采购或明确传递。{/ p>
这里的底线是你“两个”都需要尊重这里的回调,并意识到你只能使用res
一次。因此,任何地方的失败都应该实际上停止这个过程。
async.parallel
库中的async
方法可让您成为最佳控件,并提供async.waterfall
以获得更多流量控制。使用Model.create()
还允许您在一个请求中创建所有对象,而不是使用.save()
循环:
createUser: function(req,res) {
async.waterfall(
[
// Ouput from here "waterfalls" into the next function
function(callback) {
// This creates one output object with two keys
// of "array" data for the created items
async.parallel(
{
"address": function(callback) {
Models.Address.create(_postData.address,callback);
},
"contact": function(callback) {
Models.Contact.create(_postData.contact,callback);
}
},
callback
);
},
// Takes combined output to produce a user
function(data,callback) {
var _user = new Model.User(req.body);
_user.address = data.address;
_user.contact = data.contact;
_user.save(callback);
}
],
function(err,user) {
// Any errors came directly here, as does all success
if (err) {
res.send(500,err);
} else {
res.send(user);
}
}
);
}
我个人虽然在这里看到了更多的问题,因为你只是“盲目创建”参考数据。从.findOneAndUpdate()
到“查找或创建”可能的现有数据并返回该对象(可能存在)以保留在数组中作为参考,您将获得更好的实用程序。
但您可能也会调整使用对象存储库而不是关系数据库的概念。在这种情况下,如果除了当前User
以外的任何其他数据实际上没有使用此数据,那么您可能更好地“嵌入”数据而不是引用其他集合。
对于“嵌入式”数据,它只是一次更新,因为其他对象的所有数据也存储在与User
本身相同的文档中。
思考的食物,因为你似乎没有完全“理解”这里的概念。