在 couchdb 中查询名字和姓氏

问题描述 投票:0回答:1

我在文档中有两个字段:名字和姓氏。我想查询“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'
                            }
                        }
                    ]

但都没有发现任何东西。我做错了什么?

nosql find couchdb
1个回答
0
投票

我不是 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,如第一种方法所示。确保正确使用字段名称(名字和姓氏),并且正则表达式模式准确反映您正在搜索的值。如果您的数据库区分大小写或者您想确保正则表达式完全匹配。

© www.soinside.com 2019 - 2024. All rights reserved.