我可以使用一个查询更新同一项目中的两个数组吗?

时间:2017-03-12 23:49:31

标签: mongodb mongoose

我的应用中有群组。用户可以加入并邀请其他用户。在db中我将它存储起来:

Group = {
   users: [UserId: ObjectId],
   invitations: [email: string]
}

当用户接受邀请时,我希望将邀请邀请给用户:

join: (req, res, next) => {
    Group.findOneAndUpdate(
        {invitations: {$elemMatch: {email: req.user.email}}},
        {$pullAll: {invitations: req.user.email}, $addToSet: {users: req.user._id}})
        .then(succ => {
            console.log(succ);
            next()
        })
        .catch(err => {
            error(res, err)
        });
},

不幸的是,这对我不起作用。有可能以某种方式通过一个查询进行两次更改吗?如果是,怎么样?

2 个答案:

答案 0 :(得分:1)

$pullAll需要像//Inside the controller $scope.allfiles = [{ID: "One"}, {ID: "Two"}]; $scope.addToFiles = function(fileObj) { $scope.allfiles.push(fileObj); } $scope.addToFiles({ID: "Three"}); 这样的参数中的数组。您需要指定嵌套文档$pullAll: { "invitations": [ "1", "2" ] },同样适用于{ "email": req.user.email }$addToSet

查询将是:

{ "UserId": req.user._id }

答案 1 :(得分:1)

是的,你可以在一个查询中更新两个数组,你做得差不多,只是一个简单的错误。你需要从数组中只提取一个元素,所以我认为你应该使用$pull而不是$pullAll,这样你的情况会更好。 $pull需要一个元素,而$pullAll需要一个数组,所以$pull会更好。

只需将$pullAll替换为$pull即可。

试试这个:

Group.findOneAndUpdate(
    {invitations: {$elemMatch: {email: req.user.email}}},
    {$pull: {invitations: req.user.email}, $addToSet: {users: req.user._id}})
    .then(succ => {
        console.log(succ);
        next()
    })
    .catch(err => {
        error(res, err)
    });

希望这有帮助!