我在文档中有两个字段:名字和姓氏。我想查询“max smith”或“smith max”是否存在。
db.find(q)
q.selector['$or'] = [
{'$and': [
{ 'surname': { '$regex': '(?i)max' } },
{ 'firstname': { '$regex': '(?i)smith' } }
]},
{'$and': [
{'surname': {'$regex': '(?i)smith'}},
{'firstname': {'$regex': '(?i)max'}}
]}
];
和
q.selector['$and'] = [
{
'surname': {
'$regex': '(?i)max|smith'
}
},
{
'firstname': {
'$regex': '(?i)max|smith'
}
}
]
但都没有发现任何东西。我做错了什么?
我不是 CouchDB 专家,但以下是我的一些想法:
您将 $or 与 $and 一起使用来检查名称的两种可能顺序。但是,您指定正则表达式的方式似乎可能存在问题。确保字段名称正确匹配(即,根据需要使用名字和姓氏)。
q.selector['$or'] = [
{
'$and': [
{ 'firstname': { '$regex': '^(?i)max$' } },
{ 'surname': { '$regex': '^(?i)smith$' } }
]
},
{
'$and': [
{ 'firstname': { '$regex': '^(?i)smith$' } },
{ 'surname': { '$regex': '^(?i)max$' } }
]
}
];
^(?i)max$
匹配从字段值的开头 (^) 到结尾 ($) 的“max”,不区分大小写。 “史密斯”也一样。
我认为使用单个
$regex
和 max|smith 等模式将与两个单独字段中的“Max Smith”或“Smith Max”的组合不匹配。相反,它会在同一字段中的任何位置查找“max”或“smith”。要找到组合,您需要分别检查每个字段:
q.selector['$and'] = [
{
'$or': [
{ 'firstname': { '$regex': '^(?i)max$' } },
{ 'firstname': { '$regex': '^(?i)smith$' } }
]
},
{
'$or': [
{ 'surname': { '$regex': '^(?i)max$' } },
{ 'surname': { '$regex': '^(?i)smith$' } }
]
}
];
但是,这种方法仍然不能确保“Max Smith”或“Smith Max”是专门匹配的,因为它也会匹配名字或姓氏具有“max”或“smith”的文档,无论顺序如何。因此,要正确查找“Max Smith”或“Smith Max”,请使用 $or 和 $and,如第一种方法所示。确保正确使用字段名称(名字和姓氏),并且正则表达式模式准确反映您正在搜索的值。如果您的数据库区分大小写或者您想确保正则表达式完全匹配。