在OR查询中使用嵌套AND-Query进行正则表达式搜索

时间:2015-05-28 15:19:04

标签: regex mongodb

我目前正在使用正则表达式实现搜索功能(我不能使用全文搜索,因为我已在同一查询中使用$ near功能)。

查询可能如下所示:

"restaurant vegan"

我有两个属性(“标题”和“描述”)。

我想以任何顺序返回标题或说明应与查询匹配的文档。

类似的东西:

(title is 'restaurant' and title is 'vegan') or (description is 'restaurant' and description is 'vegan')

我已经实现了一个使用字幕组的代码,但MongoDB还不支持字幕组。

{ "$or":
  [
    { "title" : { "$regex" : "/(?=.*restaurant)(?=.*vegan)/i" } },
    { "description" : { "$regex" : "/(?=.*restaurant)(?=.*vegan)/i" } }
  ]
}

以下是一些示例文档:

{
  _id: 'dskladkaskdlsakldas'
  title: 'Nice restaurant',
  description: 'Eat fresh, eat vegan'
},
{
  _id: 'dsjkaskdsakdjsak',
  title: 'Cooking nice stuff',
  description: 'Vegan cooking with great people'
}

2 个答案:

答案 0 :(得分:1)

您可以使用word boundaries

var reg = /\bvegan\b|\brestaurant\b/i;   

db.collection.find({ 
    $or: 
        [
            { title: reg},
            { description: reg }
        ]
 })

答案 1 :(得分:0)

假设你正在寻找((标题包含餐厅和标题包含素食主义者)或(描述包含餐馆和描述包含素食主义者)),这与你的示例文档不对应,但似乎更逻辑,你可以简单地:

  

{" $或":[

{ "$and": 

  [

    { "title" : { "$regex" : "/restaurant/i" } },
    { "title" : { "$regex" : "/vegan/i" } }
  ]
},
{ "$and": 
  [
    { "description" : { "$regex" : "/restaurant/i" } },
    { "description" : { "$regex" : "/vegan/i" } }
  ]
}   ] }

但如果它在任何地方:

db.test.find({ "$or":   [
  { "title" : { "$regex" : /restaurant/i } },
  { "title" : { "$regex" : /vegan/i } },
  { "description" : { "$regex" : /restaurant/i } },
  { "description" : { "$regex" : /vegan/i } }
 ] });

没那么困难吗?