I have multilingual data in MongoDB with format like
{
"_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"
}
]
}
suppose is a Spanish user comes then my query is
db.getCollection('t.m').find({$text: { $search: "best",$language: "es", }})
the problem is it search in whole translation array (not in french) i also tried that is only search and return only specific language document in array i also tried based on other SO question but no luck i.e
db.getCollection('t.m').find({$text: { $search: "capten",$language: "es", },translation: {$elemMatch: {language: "english"}}})
my question has to parts
remember i create text indexes for name, desc and player. any help will be greatly appreciated.
I'm reading your post as you want to limit your full text search based on language selection from sub document. You can do it using aggregation framework, assuming you have 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"}}
])
This query will emit:
{
"_id" : ObjectId("56ebd619e07925a2286c1c3c"),
"translation" : [
{
"language" : "english",
"name" : "shahid Afridi",
"desc" : "batsmen",
"player" : "capten"
}
]
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With