大家好日子。 我是编程的初学者,有兴趣学习Meteor Js。我想按关键字或字母搜索category_name和subcategory_name。我希望有人可以帮助/指导我解决问题。你的帮助真的很感激。提前致谢。 :)
这是我的代码。
enter code here
collections: subcategory
{
_id:"ZbwCsJEMi2DesyJA7",
category_name: "ICT",
subcategory_name: "Laptop"
}
subcategory.js
Template.Subcategory.events({
"keyup .searchbox": function(event){
var query = event.target.value;
Session.set('query', query);
}
});
Template.Subcategory.helpers({
subcategory: function(){
var filter = {sort: {}};
var query = Session.get('query');
filter.sort[Session.get('sortby')] = 1;
return Subcategory.find({ subcategory_name: new RegExp(query, 'i')} , filter );
}
});
答案 0 :(得分:1)
您必须在Mongo中创建文本索引。你可以在Meteor中做到这一点我仍然想到这样的事情:
MyCollection._ensureIndex({
"$**": "text"
});
以上使用通配符,但您可以更具体。有关详细信息,请参阅https://docs.mongodb.org/v3.0/core/index-text/。
对于较大的集合,我倾向于通过订阅传递文本搜索查询,以便可以在服务器上执行。
假设您要显示一系列内容并允许用户使用搜索框过滤它们,您可以执行以下操作:
Meteor.publish('MyCollection', function (searchTerm) {
return searchTerm ? MyCollection.find() : MyCollection.find({ $text: {$search: searchTerm} });
});
在客户端上,假设您正在使用模板级订阅,您可以像这样设置订阅:
Template.Subcategory.onCreated(function(){
var self = this;
// requires the reactive-var package
self.searchTerm = new ReactiveVar(false);
self.autorun(function(){
self.subscribe( "MyCollection", self.searchTerm.get() );
});
});
然后只是设置搜索字词的情况:
Template.Subcategory.events({
'keyup .searchbox': function(e,t){
var inputValue = e.currentTarget.value,
//you could set an arbitrary minimum search term length like so
searchTerm = inputValue.length > 1 ? inputValue : false;
t.searchTerm.set(searchTerm);
}
});
有很多关于如此依赖订阅的警告。例如,如果您的集合在客户端上全局范围,那么您可能会有多次订阅同一集合的风险,从而为您提供可能不希望在列表中呈现的结果。不过,我非常喜欢这种方法。值得深思。
答案 1 :(得分:1)
好像您正在寻找$or
运营商:
var queryRegexp = new RegExp(query, 'i');
return Subcategory.find({
$or: [
{ category_name: queryRegexp },
{ subcategory_name: queryRegexp }
]
} , filter);
Mongo官方文档的$或:https://docs.mongodb.org/manual/reference/operator/query/or/