通过id和curent用户限制从数组中删除子文档

时间:2015-07-24 03:49:53

标签: javascript mongodb meteor mongodb-query

我有一个包含如下对象的Messages集合:

{
    "_id": ...,
    "author": 123,
    "body": "merp",
    "comments": [
        {
            "_id": ...,
            "author": 234,
            "body": "But what about morp?"
        },
        {
            "_id": ...,
            "author": 123,
            "body": "You're out of your element, Donnie!"
        }
    ]
}

我在添加这些comment._id时自己创建了这些author。无论如何,一切正常,我发现如何添加和删除评论数组等的东西。

除了现在删除评论时,我想首先检查Meteor.methods({ deleteMessage: function(messageId) { message = Messages.findOne(messageId); if(!message) { throw new Meteor.Error("not-found"); } if(Meteor.userId() != message.author) { throw new Meteor.Error("not-authorized"); } Messages.remove(messageId); } }); 是否是当前用户。在Meteor中,通常将对象id传递给Meteor-method,然后Meteor-method检查对象并确定是否可以执行。例如。要删除邮件,我的方法如下:

comment

现在我如何对messageId个对象做同样的事情?我想我必须通过commentIdcomment,这不是问题,但是我该如何进行权限检查?我无法通过_id获得单个message对象,是吗?至少我一直试图谷歌这个但失败了。我应该首先检索_id对象,然后手动查看它的注释数组,找到具有正确$pull的那个?

所以要更清楚:我知道如何使用comment删除_id author对象,我正在寻找我如何检查对象是否存在于首位,并且其window是当前用户?

免责声明:我是Mongo的新手,并且正在努力将评论对象放入其自己的关系风格集合中。从我所读过的内容来看,你应该将所有内容都放在一个大文档中。很可能我在这里错过了一个关键点,如果你看到它,请指出我,即使它没有回答原来的问题。谢谢! :)

1 个答案:

答案 0 :(得分:3)

要从数组中删除项目,您需要将$pull运算符与.update()

一起使用
Messages.update(
   { 
       "_id": messageId, 
       "comments._id": commentId,
       "comments.author": Meteor.userId()
   },
   { "$pull": { "comments": { "_id": commentId } } }
)

可选择查找" comments._id"以及如果该注释已被另一个请求删除,则在查询语句中以避免匹配。

为了澄清查询参数"中的"方法,这是JavaScript,因此任何function()都会被评估到对象sytax中,并返回它的值。因此,在.update()执行之前,Meteor.userId()值将与其返回值一起提交。

$pull运算符本身就像一个查询条件,并将从数组中删除与条件匹配的所有元素。您也可以包含相同的"作者"在那里办理入住手续,但这不是必需的。