所有字段search

这是我的数据集,这是一个更大的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" }, 

例:

如果有人search“礼物”,查询应扫描所有字段,如果匹配,则返回文档。

这是我尝试的,但没有工作

 db.sw_api.find({ value_chain: { $elemMatch: { "Source, Make & Deliver" } } }) 

听起来就像你需要首先在所有的文本字段上创build$text索引,因为它对用文本索引索引的字段的内容执行文本search:

 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"}); 

你创build的索引是一个由5列组成的复合索引,如果你不覆盖,mongo会自动为你创build文本命名空间。 如上所述,如果您不指定索引名称

 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自动生成,需要给它一个不太长的名字。

一旦创build索引, 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 } ] 

一旦你创build了索引,你可以做一个$textsearch:

 db.sw_api.find({ "$text": { "$search": "gift" } })