与猫鼬同步创建和更新文档

科宁

我想知道最好的方法是在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!"});
                */ 
            });
        }
    });
}

因此,我希望此功能:

  • 根据存储在groupCreator中的电子邮件创建者找到用户的文档
  • 创建一个新组(newGroup)并将创建者添加到其用户数组
  • 查找需要添加到组中的所有用户
  • 使用新创建的组的groupid(newGroup._id)更新所有用户文档中的groups数组
  • 如果所有这些都成功执行,请进行回调

这里的问题是,添加到组中的用户的所有用户文档的更新都是异步发生的,但是我想确保在返回成功或失败回调之前,所有用户文档都已正确更新。在继续其余代码(也许不使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在创建和更新文档时猫鼬会异步运行?

来自分类Dev

猫鼬-创建和保存文档,然后保存带有ID的新文档

来自分类Dev

如何用猫鼬更新文档

来自分类Dev

Node.js猫鼬更新文档

来自分类Dev

猫鼬在更新文档时会忽略$ ne

来自分类Dev

如何使用猫鼬创建和更新时间序列?

来自分类Dev

如果未找到 ID,猫鼬更新文档或插入新文档(Express REST API)

来自分类Dev

猫鼬:查找最新文档

来自分类Dev

猫鼬中间件-确定是保存新文档还是更新现有文档

来自分类Dev

猫鼬,更新子文档

来自分类Dev

递归更新猫鼬文档

来自分类Dev

如何在猫鼬中使用更新查询来更新文档?

来自分类Dev

猫鼬-更新文档,添加新键(具有strict:false)

来自分类Dev

nodejs /猫鼬更新文档中的“多级”值/无法设置属性

来自分类Dev

如何在猫鼬中获取更新文档的对象 ID?

来自分类Dev

猫鼬更新子文档的子文档

来自分类Dev

猫鼬聚合不返回最新文档

来自分类Dev

猫鼬更新子文档(如果存在)

来自分类Dev

猫鼬查找/更新子文档

来自分类Dev

通过猫鼬更新多个子文档?

来自分类Dev

猫鼬:更新嵌套文档数组

来自分类Dev

如何更新猫鼬文档中的值?

来自分类Dev

猫鼬查找和更新嵌套文档

来自分类Dev

猫鼬更新了不存在的文档

来自分类Dev

更新子文档猫鼬和nodejs

来自分类Dev

更新猫鼬中的嵌套子文档

来自分类Dev

检查文档是否已经存在,如果是,则进行更新,否则创建新的-猫鼬

来自分类Dev

同步猫鼬请求

来自分类Dev

使用Google脚本创建和打开新文档