【问题标题】:Get particular element from mongoDB array with $text search使用 $text 搜索从 mongoDB 数组中获取特定元素
【发布时间】:2016-07-05 05:42:52
【问题描述】:

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

我的问题有几个部分

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

请记住,我为名称、描述和播放器创建了文本索引。任何帮助将不胜感激。

【问题讨论】:

  • $text 索引不能这样工作。它只是在索引下搜索文本而忽略其他因素。文本索引不存储在文档中。如果要限制搜索域,请使用正则表达式。
  • @Saleem 如何只返回匹配的文档
  • 请具体说明。匹配什么?文字,语言??
  • 当然是语言
  • 好吧,我仍然很困惑,但请参阅下面的帖子。

标签: mongodb multilingual


【解决方案1】:

我正在阅读您的帖子,因为您想根据子文档中的语言选择来限制全文搜索。 你可以使用聚合框架来做到这一点,假设你有 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

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

【讨论】:

  • 未捕获的异常:聚合失败:{“errmsg”:“异常:无效的操作员'$filter'”,“code”:15999,“ok”:0 }
  • 你注意到了吗,我提到它需要 MongoDB 3.2+
  • 查看我更新的解决方案。请注意,以后请明确提及您的 MongoDB 版本。
  • 哦,我刚刚阅读了第 3 版.. 我有 3.0 很抱歉,它可能在项目中完全卡住了几个小时
猜你喜欢
  • 2016-12-22
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
相关资源
最近更新 更多