У меня есть такая коллекция в Метеоре:
TagsToArticles = {
tag: "Tag1",
articles: [ article1Id, article2Id, article3Id ]
}
Коллекции статей имеют следующую схему
Articles = {
permission: "private"
...
}
Теги по сути являются индексированными поисковыми запросами.
Для каждой статьи установлено разрешение «частное», «групповое» или «общедоступное».
Прямо сейчас я публикую теги следующим образом:
Meteor.publish("allTags", function() {
return TagsToARticles.find({});
}
А затем в клиенте я фильтрую список статей и показываю только общедоступные или приватные, но созданные текущим пользователем.
В идеале, однако, в целях безопасности я хотел бы выполнять фильтрацию на стороне сервера, внутри самой функции публикации, чтобы клиенты не имели доступа к идентификаторам статей частных статей. Я предотвращаю доступ к фактическим объектам статьи, если у клиента нет соответствующих разрешений, но я хотел бы сделать еще один шаг и полностью удалить идентификаторы из результатов.
Итак, я ищу, по сути, запрос, который позволяет мне использовать следующий псевдокод:
TagsToArticles.find({ articles.foreach(articleId) {
if (Articles.findOne(articleId).permission == 'public') ||
(Articles.findOne(articleId).ownerId == Meteor.userId())
include articleId
}
Первоначально я думал сделать это с помощью функции, точно такой же, как указано выше (в основном извлечение всех записей, а затем просмотр каждой из них и обрезка массивов вручную, а затем возврат обновленного набора записей), но я понимаю, что тогда я потеряю реактивность Метеора и набор записей не будет обновляться при изменении базовых данных.
В отсутствие единственного запроса find(), выполняющего эту работу, если есть способ выполнить дополнительный проход с функцией и по-прежнему возвращать реактивный набор данных, меня бы тоже устроило это решение.
Так как это в любом случае денормализованная коллекция (теги также расположены в документе статьи), я думаю, что я мог бы также провести дальнейшую денормализацию и включить не только идентификатор статьи, но и идентификатор владельца и разрешение. Но я все еще не уверен, как тестировать отдельные элементы массива, плюс, если возможно, я хотел бы минимизировать объем денормализации, который мне нужно сделать...
tags
, содержащее теги для этой статьи? - person Mitar   schedule 03.10.2015