我目前正在使用正则表达式实现搜索功能(我不能使用全文搜索,因为我已在同一查询中使用$ 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'
}
答案 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 } }
] });
没那么困难吗?