【问题标题】:MongooseJS/MongoDB search exact phraseMongooseJS/MongoDB 搜索精确短语
【发布时间】:2015-08-19 17:16:05
【问题描述】:

我想让我的用户搜索确切的关键字,例如指示用户用引号将关键字括起来,如“Apple”只会搜索确切的关键字Apple,而没有引号会搜索

*Apple*

如何在 MongooseJS 中编写这些查询?我想我应该在字符串的开头和结尾寻找引号?

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    我认为你是对的,检查第一个和最后一个字符是否是引号可能是最简单的。然而猫鼬本身不能做到这一点。我建议事先准备好查询并选择合适的 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 允许我们在运行时动态构造正则表达式。
    • 谢谢!不知道匹配anyKeywordAnything 需要正则表达式。该正则表达式如何工作?我只是看到您创建它并为该术语提供不区分大小写的标志或空字符串?
    • 正则表达式本身最终只是一个术语,它将匹配任何包含term 的字符串。您对不区分大小写的标志是正确的。
    • 如果我想匹配几个词,比如我有搜索词“Apple Event”应该匹配#AppleEvent。这意味着 Apple 应该存在并且 Event 才能匹配。
    猜你喜欢
    • 2023-03-28
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    相关资源
    最近更新 更多