【问题标题】:MongoDB - Contains (LIKE) query on concatenated fieldMongoDB - 包含(LIKE)对连接字段的查询
【发布时间】:2026-01-23 02:15:01
【问题描述】:

我是 MongoDB 的新手。

我正在使用 spring data 和 mongodb 编写一个应用程序,我有一个包含两个字段的类:firstnamelastname

我需要对全名中包含一个字符串 (firstname + lastname) 的文档进行一次查询。

例如:firstname = "Hansen David"lastname = "Gonzalez Sastoque" 我有一个查询要查找David Gonzalez。在这个例子中,我希望有一个匹配。

连接两个字符串可以解决,但我不知道如何执行。

【问题讨论】:

  • 不太清楚你在追求什么......你需要将你的“名字”和“姓氏”字符串分成单词然后搜索所有组合吗?或者您是否正在寻找名字和姓氏连接的子字符串(例如“Hansen David Gonzalez Sastoque”)?
  • 我正在寻找名字和姓氏连接的子字符串(更确切地说是包含)。例如,查看“Hansen David Gonzalez Sastoque”(名字+姓氏)是否包含“David Gonzalez”(要串联搜索的字符串)

标签: mongodb mongodb-query


【解决方案1】:

在文档中创建一个新的数组字段(称为names),并在该数组中将每个名称用空格分隔。在您的示例中,该数组将具有以下内容:

  1. 汉森
  2. 大卫
  3. 冈萨雷斯
  4. 够呛

(将它们全部小写以防止出现不区分大小写的问题)

在您进行查询之前,请将您的输入转换为小写并用空格分隔。

现在,您可以使用$all operator 来实现您的目标:

db.persons.find( { names: { $all: [ "david", "gonzalez" ] } } );

【讨论】:

    【解决方案2】:

    您可以在查询中使用$where 修饰符:

    db.users.findOne({$where: %JavaScript to match the document%})
    

    在您的情况下,它可能如下所示:

    db.users.findOne({$where: "this.firstname + ' ' + this.lastname == 'Gonzalez Sastoque'"})
    

    或者这个:

    db.users.findOne({$where: "this.firstname.match(/Gonzalez/) && this.lastname.match(/Sastoque/)"})
    

    我的最后一个例子正是你想要的。

    更新:尝试以下代码:

    db.users.findOne({$where: "(this.firstname + ' ' + this.lastname).match('David Gonzalez'.replace(' ', '( .*)? '))"})
    

    【讨论】:

    • 这样可能会达到效果,但是$where会产生显着的性能影响。 $where 评估 JavaScript 和 cannot take advantage of indexes
    • 是的。 $where 比可索引的替代品慢得多。这就是为什么Zaid Masud 的解决方案要好得多,尽管它需要更改数据库。
    【解决方案3】:

    您应该将您的全名拆分为名字和姓氏,然后使用适当的 MongoDB 查询选择器对这两个字段进行查询。

    【讨论】:

    • 但是,你怎么知道在哪里拆分全名?