我正在使用matteodem的Easy Search软件包,并且刚刚发现,搜索可以访问整个集合,而不是仅返回已发布的文档。
我通过设置我的发布函数来返回一个空数组,然后检查控制台中的MyCollection.find()。fetch()是否正确返回[]来测试这个。但是,使用Easy Search搜索MyCollection仍会返回集合中的所有匹配文档。
有没有办法确保Easy Search只将允许的数据传递给客户端?我在文档中找不到任何内容。
答案 0 :(得分:3)
Easy Search 正在具有通用访问权限的服务器上运行搜索。根据{{3}},您可以设置默认选择器,以按某些条件过滤搜索。在您的情况下,您只需从正常出版物(出版物中的第一个参数find()
)复制选择器,并将其设置为 Easy Search 的默认选择器。
let index = new EasySearch.Index({
collection: someCollection,
fields: ['name'],
engine: new EasySearch.Minimongo({
sort: () => ['score'], // sort by score
selector: function (searchObject, options, aggregation) {
// selector contains the default mongo selector that Easy Search would use
let selector = this.defaultConfiguration().selector(searchObject, options, aggregation);
// modify the selector to only match documents created by the current user
selector.createdBy = this.userId || options.search.userId; // to run on both client and server
return selector;
}
})
});
答案 1 :(得分:1)
来自matteodem,Easy Search的开发人员,我对如何确保只搜索返回已发布数据的原始问题有一个简单的答案。
最简单的方法是使用Minimongo等客户端搜索引擎。这将通过您的出版物访问数据,因此将准确查看您已发布的数据,不多也不少。不需要选择器。
示例代码:
postsIndex = new EasySearch.Index({
collection: Posts,
fields: ['name', 'tags', 'created_by_username'],
defaultSearchOptions: {
limit: 6
},
engine: new EasySearch.Minimongo() // search only on the client, so only published documents are returned
});
或者,您可以使用服务器端搜索引擎,例如MongoDB。在这种情况下,您应该添加一个选择器来控制返回的数据。
不幸的是,我无法让选择器与MongoDB一起工作。你不能使用Meteor.userId(),因为代码在服务器和客户端都运行,当我在文档中尝试这个配方时,我在服务器上看到一个错误。使用Michel Floyd的构造,options.search.userId存在但是为null。如果我发现如何做,我会更新这个答案的完整性。