gpt4 book ai didi

javascript - 通过 id 和当前用户限制从数组中删除子文档

转载 作者:可可西里 更新时间:2023-11-01 09:13:35 25 4
gpt4 key购买 nike

我有一个包含如下对象的 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 中,通常您将对象 ID 传递给 Meteor 方法,然后 Meteor 方法检查对象并决定是否可以执行。例如。要删除一条消息,我的方法如下所示:

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);
}
});

现在我如何对 comment 对象做同样的事情?我想我必须同时传递 messageIdcommentId,这不是问题,但是我该如何进行权限检查?我不能只通过 _id 获取单个 comment 对象,可以吗?至少我一直在尝试用谷歌搜索但失败了。我是否应该先检索 message 对象,然后手动查看它的注释数组以找到具有正确 _id 的对象?

为了让这更清楚:我知道如何使用 $pull 通过 _id 删除 comment 对象>,我正在寻找的是如何首先检查对象是否存在,以及它的 author 是当前用户吗?

免责声明:我是 Mongo 的新手,正在努力克制将评论对象放入其自己的集合(关系样式)中的冲动。根据我的阅读,您应该将所有内容放入一个大文档中。很可能我在这里遗漏了一个关键点,如果您看到它,请向我指出,即使它没有回答原始问题。谢谢! :)

最佳答案

要从数组中删除一个项目,您需要使用 $pull运算符 .update()

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

可选择在查询语句中查找是否存在“comments._id”,以避免在该评论已被另一个请求删除时出现匹配。

为了阐明“查询参数中的方法”,这是 JavaScript,所以任何 function() 都被评估为对象语法及其返回值。因此,在 .update() 执行之前,Meteor.userId() 值及其返回值被提交。

$pull 运算符本身就像一个查询条件,它会从数组中删除任何符合条件的元素。您也可以在其中包含相同的“作者”检查,但这并不是真正必要的。

关于javascript - 通过 id 和当前用户限制从数组中删除子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31601872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com