这是我的数据集,它是一个更大的json代码的一部分。我想要写一个查询,它将匹配价值链中的所有字段。
数据集:
"value_chain" : {
"category" : "Source, Make & Deliver",
"hpe_level0" : "gift Chain Planning",
"hpe_level1" : "nodemand to Plan",
"hpe_level2" : "nodemand Planning",
"hpe_level3" : "nodemand Sensing"
},示例:
如果有人搜索“礼物”,查询应该扫描所有字段,如果有匹配,则返回文档。
这是我试过的,但没有成功
db.sw_api.find({
value_chain: { $elemMatch: { "Source, Make & Deliver" } }
})发布于 2016-08-12 09:12:09
听起来,您需要首先在所有文本字段上创建$text索引,因为它对用文本索引索引的字段的内容执行文本搜索:
db.sw_api.createIndex({
"value_chain.category" : "text",
"value_chain.hpe_level0" : "text",
"value_chain.hpe_level1" : "text",
"value_chain.hpe_level2" : "text",
"value_chain.hpe_level3" : "text"
}, { "name": "value_chain_text_idx"});您创建的索引是一个由5列组成的复合索引,如果不覆盖该索引,mongo将默认情况下为您创建文本命名空间。如果没有将索引名指定为
db.sw_api.createIndex({
"value_chain.category" : "text",
"value_chain.hpe_level0" : "text",
"value_chain.hpe_level1" : "text",
"value_chain.hpe_level2" : "text",
"value_chain.hpe_level3" : "text"
});"ns name is too long (127 byte max)"有一个潜在的错误,因为文本索引将如下所示:
"you_db_name.sw_api.$value_chain.category_text_value_chain.hpe_level0_text_value_chain.hpe_level1_text_value_chain.hpe_level2_text_value_chain.hpe_level3_text"因此,需要给它起一个名字,如果由mongo自动生成的话,它不会太长。
创建索引后,db.sw_api.getIndexes()查询将显示当前的索引:
/* 1 */
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "dbname.sw_api"
},
{
"v" : 1,
"key" : {
"_fts" : "text",
"_ftsx" : 1
},
"name" : "value_chain_text_idx",
"ns" : "dbname.sw_api",
"weights" : {
"value_chain.category" : 1,
"value_chain.hpe_level0" : 1,
"value_chain.hpe_level1" : 1,
"value_chain.hpe_level2" : 1,
"value_chain.hpe_level3" : 1
},
"default_language" : "english",
"language_override" : "language",
"textIndexVersion" : 3
}
]创建索引之后,就可以执行$text搜索了:
db.sw_api.find({ "$text": { "$search": "gift" } })https://stackoverflow.com/questions/38913572
复制相似问题