我的应用中有群组。用户可以加入并邀请其他用户。在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)
});
},
不幸的是,这对我不起作用。有可能以某种方式通过一个查询进行两次更改吗?如果是,怎么样?
答案 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)
});
希望这有帮助!