我在 Meteor 中有一个这样的集合:
TagsToArticles = {
tag: "Tag1",
articles: [ article1Id, article2Id, article3Id ]
}
文章集合具有以下架构
Articles = {
permission: "private"
...
}
标签本质上是索引搜索词。
每篇文章都有一个权限设置为“私人”、“组”或“公共”。
现在,我正在发布这样的标签:
Meteor.publish("allTags", function() {
return TagsToARticles.find({});
}
然后在客户端中,我正在过滤文章列表并仅显示那些公开的或私有但由当前用户创建的文章。
但是,理想情况下,出于安全目的,我想在发布功能本身的服务器端进行过滤,以防止客户端访问私人文章的文章 ID。除非客户端具有适当的权限,否则我确实会阻止访问实际的文章对象,但我想更进一步,从结果中完全删除 ID。
所以我正在寻找的本质上是一个允许我使用以下伪代码的查询:
TagsToArticles.find({ articles.foreach(articleId) {
if (Articles.findOne(articleId).permission == 'public') ||
(Articles.findOne(articleId).ownerId == Meteor.userId())
include articleId
}
我最初考虑使用与上面完全相同的函数来执行此操作(基本上获取所有记录,然后遍历每个记录并手动修剪数组,然后返回更新的记录集),但我的理解是我会失去 Meteor 的反应性如果基础数据发生变化,记录集将不会更新。
在没有完成这项工作的单个 find() 查询的情况下,如果有一种方法可以对函数进行额外的传递并仍然返回反应性数据集,那么我也可以使用该解决方案。
由于无论如何这是一个非规范化集合(标签也位于文章文档中),我想我还可以进一步非规范化,不仅包括文章 ID,还包括 ownerId 和权限。但我仍然不确定如何测试单个数组元素,如果可能的话,我想尽量减少我需要做的非规范化量......