2016-08-12 85 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" } })