如何搜索 FS Collection?
How to search over an FS Collection?
有人可以帮我解决这个问题吗?我有一组我希望能够搜索的 PDF 文档。
我尝试使用 matteodem:easy-search 和 meteorhacks:search-source,但它们都只处理 Meteor Collections 而不是 FS。我可以让这两个包都使用常规文本。我只想 return 基于 FS 集合中名称字段的搜索查询结果。
如有任何帮助,我们将不胜感激!
- 如果你还没有安装 reactive-var 和 reactive-dict 包,如果你还没有安装
- 创建反应变量(也可以是
Session
变量)searchString
- 将您的项目显示包装在
{{#each chosenFiles}}
中,其中 chosenFiles
是您的助手名称。
创建一个帮助程序 chosenFiles
,您可以在其中调用搜索功能并为其提供文件集合中的光标。
"chosenFiles": function() {
return filterFiles(yourFileCollection.find());
}
创建 filterFiles
函数,基本上,您取回 searchString
并使用它来过滤结果,如果 searchString
为空,则返回所有内容.这是一个使用 reactive-dict 的例子:
var pageSession = new ReactiveDict();
filterFiles= function(cursor) {
if(!cursor) {
return [];
}
var searchString = pageSession.get("SearchString");
var raw = cursor.fetch();
// filter
var filtered = [];
if(!searchString || searchString == "") {
filtered = raw;
} else {
searchString = searchString.replace(".", "\.");
var regEx = new RegExp(searchString, "i");
var searchFields = ["original.name", "original.type"];
filtered = _.filter(raw, function(item) {
var match = false;
_.each(searchFields, function(field) {
var value = (getPropertyValue(field, item) || "") + "";
match = match || (value && value.match(regEx));
if(match) {
return false;
}
})
return match;
});
}
return filtered;
};
例如,将 searchString
定义附加到您的 keyUp
事件,以便您进行反应式搜索。
"keyup .yourTextBox": function(e, t) {
var searchString = e.currentTarget.value;
switch (e.which) {
//pressing esc clear the textbox
case 27:
e.currentTarget.value = "";
pageSession.set("SearchString", "");
break;
default:
pageSession.set("SearchString", searchString);
}
我不是 100% 确定 "original.name" 是访问名称字段的正确方法,因为我不使用 collectionFS 但它似乎是,according to the doc
有人可以帮我解决这个问题吗?我有一组我希望能够搜索的 PDF 文档。 我尝试使用 matteodem:easy-search 和 meteorhacks:search-source,但它们都只处理 Meteor Collections 而不是 FS。我可以让这两个包都使用常规文本。我只想 return 基于 FS 集合中名称字段的搜索查询结果。
如有任何帮助,我们将不胜感激!
- 如果你还没有安装 reactive-var 和 reactive-dict 包,如果你还没有安装
- 创建反应变量(也可以是
Session
变量)searchString
- 将您的项目显示包装在
{{#each chosenFiles}}
中,其中chosenFiles
是您的助手名称。 创建一个帮助程序
chosenFiles
,您可以在其中调用搜索功能并为其提供文件集合中的光标。"chosenFiles": function() { return filterFiles(yourFileCollection.find()); }
创建
filterFiles
函数,基本上,您取回searchString
并使用它来过滤结果,如果searchString
为空,则返回所有内容.这是一个使用 reactive-dict 的例子:var pageSession = new ReactiveDict(); filterFiles= function(cursor) { if(!cursor) { return []; } var searchString = pageSession.get("SearchString"); var raw = cursor.fetch(); // filter var filtered = []; if(!searchString || searchString == "") { filtered = raw; } else { searchString = searchString.replace(".", "\."); var regEx = new RegExp(searchString, "i"); var searchFields = ["original.name", "original.type"]; filtered = _.filter(raw, function(item) { var match = false; _.each(searchFields, function(field) { var value = (getPropertyValue(field, item) || "") + ""; match = match || (value && value.match(regEx)); if(match) { return false; } }) return match; }); } return filtered; };
例如,将
searchString
定义附加到您的keyUp
事件,以便您进行反应式搜索。"keyup .yourTextBox": function(e, t) { var searchString = e.currentTarget.value; switch (e.which) { //pressing esc clear the textbox case 27: e.currentTarget.value = ""; pageSession.set("SearchString", ""); break; default: pageSession.set("SearchString", searchString); }
我不是 100% 确定 "original.name" 是访问名称字段的正确方法,因为我不使用 collectionFS 但它似乎是,according to the doc