我想知道最好的方法是在Node.js和猫鼬中实现以下情况:
我有一个与用户和一个组与一个集合的集合。我希望用户能够创建新组并向其中添加人员(非常类似于创建新的whatsapp组的人员)。我对用户和组文档使用以下架构:
var userSchema = mongoose.Schema({
email: String,
hashed_password: String,
salt: String,
name: String,
groups: [{
_id: { type: Schema.Types.ObjectId, required: true, ref: 'groups' },
name: String
}]
});
var groupSchema= mongoose.Schema({
name: String,
creator: Schema.Types.ObjectId,
users: [{
_id: { type: Schema.Types.ObjectId, required: true, ref: 'users' },
rankInGroup: { type: Number, required: true }
}]
});
目前,我有一个采用以下参数的函数:创建组的用户的电子邮件地址(groupCreator),新组的名称(newGroupName)以及需要执行以下操作的用户的用户ID(newGroupMembers)被添加到组中。此函数首先查找需要添加到组中的用户(使用此方法),然后将这些用户的用户ID添加到组文档中的users数组中,如下所示:
function(groupCreator, newGroupName, newGroupMembers , callback) {
userModel.findOne({
email: emailGroupCreator
}, function(err,creator){
//load document of user who creates the group into creator variable
var newGroup = new groupModel({
name: newGroupName,
creator: creator._id,
users: [{_id: creator._id, rank: 0}] //add group creator to the group
});
userModel.find({
email: { $in: newGroupMembers }
}, function(err,users){
//for now assume no error occurred fetching users
users.forEach(function(user) {
newGroup.users.push({_id: user._id, rank: 0}); //add user to group
user.groups.push({_id:newGroup._id,name:newGroup.name}); //add group to user
}
newGroup.save(function (err) {
//for now assume no error occurred
creator.groups.push({_id: newGroup._id, name: newGroup.name}); //add group to creator
creator.save(function (err) {
//for now assume no error occurred
/* save/update the user documents here by doing something like
newMembers.forEach(function(newMember) {
newMember.save(function (err) {
if(err){
callback(500, {success: false, response: "Group created but failure while adding group to user: "+newMember.email});
}
});
});
callback(200, {success: true, response: "Group created successfully!"});
*/
});
}
});
}
因此,我希望此功能:
这里的问题是,添加到组中的用户的所有用户文档的更新都是异步发生的,但是我想确保在返回成功或失败回调之前,所有用户文档都已正确更新。在继续其余代码(也许不使用foreach)之前,如何更新所有用户文档?我最初检索所有用户文档的方法是好的还是有更好的方法来做到这一点?
因此,最重要的问题是;在执行所有保存操作之后,如何保存多个用户文档并继续其余代码(发送回调以通知成功或失败),或者有没有一种方法可以一次保存所有文档?
注意:我想要在用户和组文档中都包含(相同)信息的原因是因为我不想加载用户登录时的所有组信息,而只加载基本组信息。另请参见“多对多关系”部分下的此来源。
JohnnyHK为我指出了正确的方向;async.each使得遍历文档并一次更新一个文档成为可能。之后,其余代码将被执行。这是我的代码现在的样子:
async.each(groupMembersDocs, function (newMember, loopCallback) {
//console.log('Processing user ' + newMember.email + '\n');
userModel.update({
email: newMember.email
}, {
$push: { 'groups' : {_id: newGroup._id, name: newGroup.name} }
}, function (err, data) {
if(err){
console.log("error: "+err);
loopCallback('Failure.. :'+err);
} else{
newGroup.users.push({_id: newMember._id, rank: -1});
loopCallback();
}
});
}, function (err){
if(err){
console.log("error: "+err);
callback(500, {success: false, response: "Error while adding users to group"});
} else{
newGroup.save(function (err) {
callback(201, {success: true, response: "Group created successfully"});
});
}
})
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句