我正试图获得一些文件取决于什么查询您键入。
例如,我有一堆文档:
[
{name: 'jon', city: 'la', country: 'us'},
{name: 'foo', city: 'ca', country: 'us'},
{name: 'alf', city: 'ca', country: 'us'},
{name: 'olla', city: 'la', country: 'us'},
{name: 'prol', city: 'la', country: 'us'},
{name: 'jon', city: 'ca', country: 'us'}
]
如果我查询jon la
,我需要{name: 'jon', city: 'la'}
作为结果。
我使用Mongoose和find()
方法。
我尝试了正则表达式和文本搜索索引。
使用文本:
.find({
'$text': {
$search: 'jon la'
},
})
使用正则表达式:
.find({
'$or': [
{ name: { $regex: '^jon|^la' } },
{ city: { $regex: '^jon|^la' } },
{ country: { $regex: '^jon|^la' } }
],
})
我从这两种方法中得到了以下结果:
{name: 'jon', city: 'la', country: 'us'},
{name: 'olla', city: 'la', country: 'us'},
{name: 'prol', city: 'la', country: 'us'},
{name: 'jon', city: 'ca', country: 'us'}
这里的问题是,我永远不知道它是否应该在name、city或对象中的任何其他键上找到。例如,查询可以是jon us
,那么我希望在us中获得所有jon,而不是所有jon和所有us。
我怎样才能做到这一点?
我正在考虑一个选项,例如
1条答案
按热度按时间hvvq6cgz1#
如果您明确需要
name=jon
和city=la
(或它们的正则表达式)的文档,就不要使用$or
如果问题是您不知道要搜索什么(例如,您需要查找匹配超过2个单词的结果),那么事情就更复杂了,我认为您需要使用聚合管道。
如果您关心的是查找“最佳n”匹配项,则可以使用全文搜索评分
有关textScore的更多信息,请访问:https://www.mongodb.com/docs/manual/reference/operator/query/text/