MongoDB:如何在不指定数组索引的情况下在任何字段的子文档中查找包含字符串的文档?

时间:2016-02-22 15:37:58

标签: mongodb mongodb-query

我想找到所有包含" school "在任何子文档字段中,例如,如果我们有两个文档:

{
    name: "aa",
    schools: [
        {
            name: "high school",
            description: "aaaa"
        },
        {
            name: "a1",
            description: "blabla bla school"
        },
        ...
    ],
},
{
    name: "bb",
    schools: [
        {
            name: "bbb",
            description: "First school of ..."
        },
        {
            name: "b school",
            description: "bbb  bb b",
            ...
        }
    ],
},

这些文件应与第一所或/或第二所学校的名称和/或描述相符。

我尝试了此查询但没有成功:

{
    schools: /.*school.*/
}

这也是通过列出字段:

{
    school: [
        { name: /.*school.*/ },
        { description: /.*school.*/ },
        ...
    ]
}

他们有办法执行此操作吗?

2 个答案:

答案 0 :(得分:2)

最简单的方法是创建全文索引。

您可以按照https://docs.mongodb.org/manual/core/index-text/

上的文档执行此操作

然后可以使用$ text运算符查询索引:https://docs.mongodb.org/manual/reference/operator/query/text/

在所有字段上创建索引

db.schools.createIndex( { "$**": "text" } )

搜索

db.schools.find({
  $text:
    {
      $search: "school",
      $language: "en",
      $caseSensitive: false,
      $diacriticSensitive: false
    }
})

答案 1 :(得分:1)

如果您需要真正的通配符查询,那么@ a-h关于文本索引的答案是可行的方法。但您也可以使用$or查询来检查匹配的多个字段:

db.schools.find({
  $or: [
    { 'schools.name': /school/ },
    { 'schools.description': /school/ },
    ...
  ]
})