我有一个包含如下对象的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
个对象做同样的事情?我想我必须通过commentId
和comment
,这不是问题,但是我该如何进行权限检查?我无法通过_id
获得单个message
对象,是吗?至少我一直试图谷歌这个但失败了。我应该首先检索_id
对象,然后手动查看它的注释数组,找到具有正确$pull
的那个?
所以要更清楚:我知道如何使用comment
删除_id
author
对象,我正在寻找我如何检查对象是否存在于首位,并且其window
是当前用户?
免责声明:我是Mongo的新手,并且正在努力将评论对象放入其自己的关系风格集合中。从我所读过的内容来看,你应该将所有内容都放在一个大文档中。很可能我在这里错过了一个关键点,如果你看到它,请指出我,即使它没有回答原来的问题。谢谢! :)
答案 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
运算符本身就像一个查询条件,并将从数组中删除与条件匹配的所有元素。您也可以包含相同的"作者"在那里办理入住手续,但这不是必需的。