这是我的样本数据
{
_id: 123123123,
author:{
name : "username"
},
data:{
title : "Hello World"
}
}
这是我的索引命令:db.post.createIndex({"data.title":"text"})
但是当我执行db.post.find( { $text: { $search: "Hello" } } )
时,我得不到任何回报。
我应该运行什么命令来索引mongodb中的嵌入对象?
答案 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" : {}
}
}