skip to Main Content

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

2

Answers


  1. 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

    Login or Signup to reply.
  2. db.collection.aggregate([
      {
        $match: {
          $and: [
            {
              "phone_number": "041041041"
            },
            {
              "country": "_si"
            },
            {
              $or: [
                {
                  "blacklisted_service.all": true
                },
                {
                  "blacklisted_service.promo_code_sms": true
                }
              ]
            }
          ]
        }
      }
    ])
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search