2016-03-18 67 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