2016-03-18 97 views
3

我有多種語言數據,在MongoDB中與像

{ 
    "_id" : ObjectId("56ebd619e07925a2286c1c3c"), 
    "translation" : [ 
     { 
      "language" : "english", 
      "name" : "shahid Afridi", 
      "desc" : "batsmen", 
      "player" : "capten" 
     }, 
     { 
      "language" : "spanish", 
      "name" : "shhid Ofridi", 
      "desc" : "batsmeen", 
      "player" : "capteen" 
     }, 
     { 
      "language" : "french", 
      "name" : "hhid afrede is best", 
      "desc" : "batsmin", 
      "player" : "captn" 
     } 
    ] 
} 

假設格式是西班牙用戶自帶然後我查詢

db.getCollection('t.m').find({$text: { $search: "best",$language: "es", }}) 

的問題是,它在整個翻譯陣列(未法語)搜索 我也試過,只搜索和我也嘗試基於陣列只返回特定語言的文檔其他太問題,但沒有運氣即

db.getCollection('t.m').find({$text: { $search: "capten",$language: "es", },translation: {$elemMatch: {language: "english"}}}) 

我的問題有部分

  • 查詢只能在翻譯即尋找一種語言只有在執行西班牙語或英語
  • 和翻譯陣列不是整個翻譯陣列查詢只返回特定的對象之後

記得我創造的名稱,說明和球員文本索引。任何幫助將不勝感激。

+0

$文本索引不會以這種方式工作。它只是在索引下搜索文本而忽略其他因素。文本索引不會與文檔一起存儲。如果你想限制搜索域,使用正則表達式。 – Saleem

+0

@Saleem怎麼樣只返回匹配的文檔 –

+0

請具體說明。匹配什麼?文字,語言?當然語言 – Saleem

回答

2

我讀您的文章,只要你想根據從子文件語言選擇限制您的全文搜索。 可以使用聚合框架做到這一點,假設你有MongoDB的3.2+

如果MongoDB的3.2+

db.doc.aggregate([ 
{$match:{$text: {$search:"shahid Afridi"}}}, 
{$project: 
    {translation: 
    {$filter: 
     {input: "$translation", as:"tr", cond: { $eq : ["$$tr.language", "english"]}} 
    } 
    } 
}]) 

MongoDB的< 3.2

db.doc.aggregate([ 
    {$match:{$text: {$search:"shahid Afridi"}}}, 
    {$unwind:"$translation"}, 
    {$match:{"translation.language":"english"}} 
]) 

這個查詢會發出:

{ 
    "_id" : ObjectId("56ebd619e07925a2286c1c3c"), 
    "translation" : [ 
     { 
      "language" : "english", 
      "name" : "shahid Afridi", 
      "desc" : "batsmen", 
      "player" : "capten" 
     } 
    ] 
} 
+0

未捕獲的異常:總失敗:{ 「ERRMSG」: 「異常:無效的操作結束時切 '$過濾器'」, \t 「代碼」:15999, \t 「OK」:0 } –

+0

你有沒有注意到,我提到它需要的MongoDB 3.2+ – Saleem

+0

查看我的更新解決方案。請注意,將來要明確提及你的MongoDB版本。 – Saleem