使用$text search从mongoDB数组中获取特定元素

使用$text search从mongoDB数组中获取特定元素,mongodb,multilingual,Mongodb,Multilingual,我在MongoDB中有多语言数据,格式如下 { "_id" : ObjectId("56ebd619e07925a2286c1c3c"), "translation" : [ { "language" : "english", "name" : "shahid Afridi", "desc" : "batsmen", "player" : "capten"

我在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", }})
问题是它在整个翻译数组中搜索(不是法语) 我也尝试过,这是唯一的搜索和返回数组中唯一的特定语言文档,我也尝试过基于其他SO问题,但没有运气,即

db.getCollection('t.m').find({$text: { $search: "capten",$language: "es", },translation: {$elemMatch: {language: "english"}}})
我的问题分为四个部分

  • 在翻译中仅查询一种语言,即仅以西班牙语或英语执行搜索
  • 查询后只返回转换数组中的特定对象,不返回整个转换数组

记住,我为name、desc和player创建了文本索引。非常感谢您的帮助。

我正在阅读您的文章,因为您希望根据子文档中的语言选择限制全文搜索。 假设您有MongoDB 3.2,您可以使用聚合框架来实现这一点+

如果MongoDB 3.2+

MongoDB<3.2

此查询将发出:

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

$text index不能以这种方式工作。它只是在索引下搜索文本,忽略其他因素。文本索引不与存储在文档中。如果要限制搜索域,请使用正则表达式。@Saleem仅返回匹配的文档如何?请具体说明。什么匹配?文本,语言??当然语言好吧,我仍然很困惑,但请看下面我的帖子。未捕获异常:聚合失败:{“errmsg”:“异常:无效运算符'$filter'”,“代码”:15999,“确定”:0}您注意到了吗,我提到它需要MongoDB 3.2+查看我的更新解决方案。请注意,以后一定要明确提到您的MongoDB版本。。我有3.0,很抱歉,我可能在项目中完全被困了几个小时
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"
        }
    ]
}