【发布时间】:2015-08-19 17:16:05
【问题描述】:
我想让我的用户搜索确切的关键字,例如指示用户用引号将关键字括起来,如“Apple”只会搜索确切的关键字Apple,而没有引号会搜索
*Apple*
如何在 MongooseJS 中编写这些查询?我想我应该在字符串的开头和结尾寻找引号?
【问题讨论】:
标签: javascript node.js mongodb mongoose
我想让我的用户搜索确切的关键字,例如指示用户用引号将关键字括起来,如“Apple”只会搜索确切的关键字Apple,而没有引号会搜索
*Apple*
如何在 MongooseJS 中编写这些查询?我想我应该在字符串的开头和结尾寻找引号?
【问题讨论】:
标签: javascript node.js mongodb mongoose
我认为你是对的,检查第一个和最后一个字符是否是引号可能是最简单的。然而猫鼬本身不能做到这一点。我建议事先准备好查询并选择合适的 find 方法。
我们还可以使用$regex 运算符针对集合中每个文档的“关键字”属性执行给定的正则表达式。
var userInput = '"Apple"';
var term = userInput.trim();
var caseInsensitive = true; // = some user input?
var isExactTerm = (function() {
var firstChar = term[0];
var lastChar = term[term.length - 1];
return (firstChar === '"' && lastChar === '"');
}();
if(isExactTerm) {
// Remove quotes from the query
term = term.substr(1, str.length - 1);
}
var method = (isExactTerm) ? 'findOne': 'find';
var regexFlags = (caseInsensitive) ? 'i' : '';
var query = (isExactTerm) ? term : {$regex: new RegExp(term, regexFlags)};
Model[method]({
keyword: query
}).exec().then(function(result) {
// do stuff with `result`
}, function(err) {
// handle `err`
});
【讨论】:
$regex 运算符针对集合中每个文档的“关键字”属性执行给定的正则表达式。在这种情况下,如果关键字包含 term,则返回 true。 RegExp 允许我们在运行时动态构造正则表达式。
term 的字符串。您对不区分大小写的标志是正确的。