2016-08-12 87 views
2

这是我的数据集,它是更大的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" } } 
}) 
+0

我在我的问题中做了一些修改 –

回答

0

听起来像是你需要创建的所有文本字段第一$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列的一个综合指数,以及蒙戈将默认自动创建文本命名空间为你,如果你不重写。通过以上,如果不指定索引的名称为

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