2017-08-31 63 views
0

这是我的样本数据MongoDB的全文搜索里面嵌入对象

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

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

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

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

回答

0

这是: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 
    } 
    
  • 确认有肯定一包含Hello的文件data.title。你可以通过运行一个简单的查找来实现: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" : {} 
          } 
         }