【问题标题】:Mongoose: boolean 'or' query with wildcardMongoose:带有通配符的布尔“或”查询
【发布时间】:2012-08-23 18:21:05
【问题描述】:

我正在尝试使用 Mongoose 模拟将全文搜索分为两个字段。我大部分时间都在测试几种查询类型,但总是失败。 MongoDB shell 查询是这个:

db.feeds.item.find({lang:"en", $or:[{title: /searchexpression/}, {body: /searchexpression/}] })

在此示例中,我只想返回与 titlebody 字段或两个字段中的搜索表达式(包括正则表达式)匹配的英文文档。此查询有效,但正如我所说,当尝试使用 Mongoose 调整它时,问题就开始了,:-(

我使用的一些表达方式,但不起作用:

exports.fullTextSearch = function(lang, text, callback) { 
    MyModel.find({lang:lang, $or: [{title:/text/},{body:/text/}]}).exec(callback);
    MyModel.find({lang:lang, $or: [{title: new RegExp('\/'+text+'\/')}, {body:new RegExp('\/'+text+'\/')}]}).exec(callback);
    MyModel.find({lang:lang}).or({title:/text/},{body:/text/}).exec(callback);
    MyModel.find({lang:lang}).or({title:new RegExp('\/'+text+'\/')},{body:new RegExp('\/'+text+'\/')}).exec(callback);    

}

非常感谢!

路易斯·卡帕。

【问题讨论】:

    标签: javascript node.js mongodb mongoose mongodb-query


    【解决方案1】:

    尚未对此进行测试,但根据文档,这应该可以:

    MyModel.find({lang:lang}).or([{title:/text/},{body:/text/}]).exec(callback);
    

    与您的第三个示例类似,但在数组中使用“或”条件。

    编辑:

    要使正则表达式动态化,请使用第四个示例,但在数组中使用“或”条件:

    MyModel.find({lang:lang}).or([{title:new RegExp(text)},{body:new RegExp(text)}]).exec(callback);
    

    或者在外面定义正则表达式:

    var regexText = new RegExp(text)
    MyModel.find({lang:lang}).or([{title:regexText},{body:regexText}]).exec(callback);
    

    【讨论】:

    • 我之前尝试过相同的查询,但没有成功。我再次完全复制粘贴了您的建议,但什么也没有,:-( 我开始认为这可能是 Mongoose 错误...
    • 我将查询简化为只执行一个字段,例如:MyModel.find({lang:lang, title: new RegExp('\/'+text+'\/')})。执行(回调);它可能是与正则表达式相关的 Mongoose 错误,甚至可能是未记录的查询组件。
    • 没有错误!问题与搜索表达式本身有关。执行搜索的搜索表达式来自 HTTP 请求参数,因此可能某些解码或特殊字符转义问题与没有结果有关。但是,这很奇怪,因为打印搜索表达式时看起来还不错。我会继续测试。非常感谢您抽出宝贵时间,拉格纳!
    • 好的,html编码会出问题。
    猜你喜欢
    • 2014-12-22
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    相关资源
    最近更新 更多