mongodb查找:如何在$where中使用变量regexp?

svmlkihl  于 2022-11-26  发布在  Go
关注(0)|答案(2)|浏览(127)

我有一个nodejs express web,其中有一个mongo数据库,

const AuthorSchema = new Schema({
    first_name: { type: String, required: true, maxLength: 100 },
    family_name: { type: String, required: true, maxLength: 100 },
    date_of_birth: { type: Date },
    date_of_death: { type: Date },
});

我想使用正则表达式搜索作者的名字+姓氏。换句话说,假设我们有一个作者:...名字(_N):“亚历山德罗”家族名称:'Manzoni'...我想使用所有搜索字符串进行匹配:
“亚历山德罗”或“艾尔”或“曼佐”或“亚历山德罗曼佐尼”或“曼佐尼亚历山德罗”
所以我写了这个:

const searchRegex = new RegExp(req.body.search_text, 'i');  
Author.find({ $where: 
    function() {
        return (searchRegex.test(this.first_name + " " + this.family_name) 
            || searchRegex.test(this.family_name + " " + this.first_name) )
    } 
},"_id").exec(function (err, list_authors) {

我得到了:

MongoServerError: Executor error during find command :: caused by :: ReferenceError: searchRegex is not defined :
@:2:33

我尝试使用$let子句,但我所做的只是在结果列表中获取所有作者的id。

eqqqjvef

eqqqjvef1#

我认为您正在寻找类似这样的东西(并且避免效率非常低的$where):
此查询将名字和姓氏连接起来,并对其进行正则表达式匹配。
如果正则表达式中有匹配项(结果为true),则返回文档,否则不返回。

Author.find({
  "$expr": {
    "$eq": [
      {
        "$regexMatch": {
          "input": {
            "$concat": [
              "$first_name",
              " ",
              "$family_name"
            ]
          },
          "regex": yourStringRegexHere,
          "options": "i"
        }
      },
      true
    ]
  }
})

示例here

rjzwgtxy

rjzwgtxy2#

谢谢,你的答案很好用。我在family_name +““+ first_name中添加了一个$or来搜索,并删除了选项行,因为它们在正则表达式中。所以最终的代码是:

Author.find({$or: [
                {
                  "$expr": {
                    "$eq": [
                      {
                        "$regexMatch": {
                          "input": {
                            "$concat": [
                              "$first_name",
                              " ",
                              "$family_name"
                            ]
                          },
                          "regex": searchRegex
                        }
                      },
                      true
                    ]
                  }
                },
                {
                  "$expr": {
                    "$eq": [
                      {
                        "$regexMatch": {
                          "input": {
                            "$concat": [
                              "$family_name",
                              " ",
                              "$first_name"
                            ]
                          },
                          "regex": searchRegex
                        }
                      },
                      true
                    ]
                  }
                },                    
                ]},"_id").exec(callback);

真的有很多代码,但它工作...

相关问题