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

Get particular element from mongoDB array with $text search

我在 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", }})

问题是它在整个翻译数组中搜索(不是法语) 我也试过这只是搜索并且 return 只是数组中的特定语言文档我也尝试过基于其他 SO 问题但没有运气,即

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

我的问题有一部分

记住我为 name、desc 和 player 创建了文本索引。任何帮助将不胜感激。

我正在阅读您的 post,因为您希望根据从子文档中选择的语言来限制全文搜索。 假设您有 MongoDB 3.2+

,您可以使用聚合框架来完成

If 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"
        }
    ]
}