Home > Software engineering >  Mongo db aggregate $elemMatch returns empty set
Mongo db aggregate $elemMatch returns empty set

Time:05-19

I'm trying to figure out what is the proper query for my current case. I have Mongo db documents, which looks like this

{ 
    "_id" : ObjectId("627e24df17446e1f646c945c"), 
    "phone_number" : "041041041", 
    "country" : "_si", 
    "blacklisted_service" : {
        "all" : false, 
        "place_order" : false, 
        "promo_code_sms" : true
    }, 
}

Now I'm trying to query documents, where "phone_number": 041041041 && "country" : "_si" AND ("blacklisted_service.all": true OR "blacklisted_service.promo_code_sms": true)...

Currently I'm trying to achieve my goal with aggregate & $elemMatch functions, but my results are always empty

db.getCollection("blacklisted_sms").aggregate([
    {
        $match: {
            phone_number: '041041041',
            country: '_si',
            blacklisted_service: {
                $elemMatch: {
                    'all': true,
                    $or: [
                        {
                            promo_code_sms: true,
                        }
                    ]
                },
            }
        }
    }
]);

Can you please help me define proper query, which will return a result if phone_number and country match in addition to check if one blacklisted_service key value is true. If you have any additional questions, please let me know and I will provide. I'm using mongo DB versions 4.x. Thank you in advance

CodePudding user response:

You can try following,

db.collection.aggregate([
  {
    $match: {
      $expr: {
        $and: [
          { $eq: ["$phone_number", "041041041" ] },
          { $eq: [ "$country", "_si" ] },
          {
            $or: [
              { $eq: [ "$blacklisted_service.all", true ] },
              { $eq: [ "$blacklisted_service.promo_code_sms", true ] },
              
            ]
          }
        ]
      }
    }
  }
])

Working Mongo playground

  • Related