MongoDB在嵌入对象内部进行全文搜索

时间:2017-08-31 17:38:03

标签: json mongodb indexing mongodb-query

这是我的样本数据

{
    _id: 123123123,
    author:{
     name : "username"
    },
    data:{
     title : "Hello World"
    }
}

这是我的索引命令:db.post.createIndex({"data.title":"text"})

但是当我执行db.post.find( { $text: { $search: "Hello" } } )时,我得不到任何回报。

我应该运行什么命令来索引mongodb中的嵌入对象?

1 个答案:

答案 0 :(得分:2)

这个:db.post.createIndex({"data.title":"text"})是在嵌入字段上创建文本索引的正确命令。

这是:db.post.find( { $text: { $search: "Hello" } } )是使用文本索引在嵌入字段中搜索值Hello的正确方法:data.title

你正在做的一切正确。为了验证这一点,我已将您的文档写入集合,使用您提供的createIndex()命令在该集合上创建了一个文本索引,并使用您提供的find()命令和该文档进行搜索。 返回。

所以,也许问题出在其他地方。我建议你:

  • 确认文本索引是肯定创建的。您可以通过运行db.post.getIndexes()来执行此操作,如果文本索引存在并覆盖data.title,那么您应该在该命令的输出中看到类似的内容:

    {
        "v" : 2,
        "key" : {
            "_fts" : "text",
            "_ftsx" : 1
        },
        "name" : "data.title_text",
        "ns" : "<your database name>.post",
        "weights" : {
            "data.title" : 1
        },
        "default_language" : "english",
        "language_override" : "language",
        "textIndexVersion" : 3
    }
    
  • 确认肯定包含data.title Hello的文档。您可以通过运行简单的查找来完成此操作:db.post.find({'data.title': { $regex: /Hello/ } })

  • 确认此命令:db.post.find( { $text: { $search: "Hello" } } ) 肯定使用您的文字索引。您可以通过使用.explain()(例如db.post.find( { $text: { $search: "Hello" } } ).explain())调用该命令来执行此操作,输出应包含以下内容:

        "inputStage" : {
            "stage" : "TEXT_MATCH",
            "inputStage" : {
                "stage" : "TEXT_OR",
                "inputStage" : {
                    "stage" : "IXSCAN",
                    "keyPattern" : {
                        "_fts" : "text",
                        "_ftsx" : 1
                    },
                    "indexName" : "data.title_text",
                    "isMultiKey" : true,
                    "isUnique" : false,
                    "isSparse" : false,
                    "isPartial" : false,
                    "indexVersion" : 2,
                    "direction" : "backward",
                    "indexBounds" : {}
                }
            }