使用 $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"}}})
我的问题有一部分
- 在翻译中仅查询一种语言,即仅以西班牙语或英语执行搜索
- 查询后 return 仅来自翻译数组的特定对象而不是整个翻译数组
记住我为 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"
}
]
}
我在 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"}}})
我的问题有一部分
- 在翻译中仅查询一种语言,即仅以西班牙语或英语执行搜索
- 查询后 return 仅来自翻译数组的特定对象而不是整个翻译数组
记住我为 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"
}
]
}