Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按id和当前用户限制从数组中删除子文档_Javascript_Mongodb_Meteor_Mongodb Query - Fatal编程技术网

Javascript 按id和当前用户限制从数组中删除子文档

Javascript 按id和当前用户限制从数组中删除子文档,javascript,mongodb,meteor,mongodb-query,Javascript,Mongodb,Meteor,Mongodb Query,我有一个包含如下对象的消息集合: { "_id": ..., "author": 123, "body": "merp", "comments": [ { "_id": ..., "author": 234, "body": "But what about morp?" }, { "_id": ...,

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

{
    "_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!"
        }
    ]
}
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);
  }
});
我正在创建这些
注释。\u id
在添加它们时是我自己创建的。总之,一切都很好,我发现了如何添加和删除评论数组中的内容等

除了现在删除评论外,我想首先检查
作者是否是当前用户。在Meteor中,通常将对象id传递给Meteor方法,然后Meteor方法检查对象并决定是否可以执行。例如,要删除邮件,我的方法如下所示:

{
    "_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!"
        }
    ]
}
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);
  }
});
现在,我如何对
注释
对象执行相同的操作?我想我必须同时通过
messageId
commentId
,这不是问题,但是我该如何进行权限检查呢?我不能通过
\u id
只获取一个
注释
对象,可以吗?至少我一直在用谷歌搜索,但失败了。我是否应该首先检索
消息
对象,然后手动查看其注释数组以找到具有正确
\u id的对象

为了更清楚地说明这一点:我知道如何使用
$pull
通过
\u id
删除
注释
对象,我要寻找的是如何首先检查对象是否存在,以及它的
作者是否是当前用户


免责声明:我是Mongo的新手,我不想把评论对象放在它自己的集合——关系风格中。据我所知,你应该把所有的东西都放在一个大文件里。很可能我遗漏了一个关键点,如果你看到了,请向我指出,即使它没有回答最初的问题。谢谢!:)

若要从数组中删除项,则要使用运算符

也可以在查询语句中查找“comments.\u id”的存在,以避免在该注释已被其他请求删除时出现匹配

为了澄清“查询参数内的方法”,这是JavaScript,因此任何
函数()
都将使用其返回值计算到对象sytax中。因此,在执行
.update()
之前,将
Meteor.userId()
值与其返回值提交


$pull
操作符本身就像一个查询条件,它将从数组中删除与条件匹配的任何元素。您也可以在其中包含相同的“作者”签入,但这并不是必需的。

谢谢!如前所述,我已经知道如何从comments数组中删除对象。问题是如何检查
注释
作者
是否是当前用户?我对问题进行了编辑,使其更具说服力clear@cpury键入时,查询中缺少该行。这在你的API中很好,但是一般来说,你应该让你的前端不允许删除一条不是他们的评论的“点击”动作。但这是另一个问题。对,删除按钮不显示在前端,但出于安全考虑,我确实需要检查后端。谢谢你最新的回答,这非常接近我想要的。我想我不必检查“未发现”或“禁止”错误,因为在这种情况下根本不会发生任何事情。@cpury所以这就是我刚才在回答中向您展示的方法。您的消息“应该”执行大致相同的操作,而不是首先检索文档。UI部分只是建议。好的,谢谢,那么我将使用你的解决方案。也谢谢你的建议!