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部分只是建议。好的,谢谢,那么我将使用你的解决方案。也谢谢你的建议!