Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get particular element from mongoDB array with $text search

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

  • query only one language in translation i.e search performed only in spanish or english
  • and after query return only specific object from translation array not whole translation array

remember i create text indexes for name, desc and player. any help will be greatly appreciated.

like image 700
Abdul Hameed Avatar asked Dec 13 '25 02:12

Abdul Hameed


1 Answers

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"
        }
    ]
}
like image 104
Saleem Avatar answered Dec 15 '25 19:12

Saleem



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!