skip to Main Content

I wish to find out all the matching documents in a collection for which the MatchCondition is false. I am trying to do this in the aggregate pipeline using match operator but that is not working.

{
    "_id": {
        "$oid": "98rr6c03a82b7785f372c018"
    },
    "document": "DocumentName",
    "ecuCheckResultList": [
      {
        "animal": "CAT",
        "attribute1": "value",
        "attribute2": "value",
        "MatchCondition": true
      },
      {
        "animal": "DOG",
        "attribute1": "value",
        "MatchCondition": false
      }
    ]
  }

I am aware that there are options to do this using find, but there are separate operations which need to take place on this data, so using aggregate pipeline.

In the end, I need to find out the total counts of each animal within the collection that are having MatchCondition = false

There are more than 1.9 million documents within my collection on which I want to query this data.

2

Answers


  1. You can $map to construct an auxiliary boolean array to check whether the MatchCondition is false. For your case, a simple $not will work as it can flip the false to true. Afterwards, use $anyElementTrue to perform the filtering.

    db.collection.aggregate([
      {
        "$match": {
          $expr: {
            "$anyElementTrue": {
              "$map": {
                "input": "$ecuCheckResultList.MatchCondition",
                "as": "mc",
                "in": {
                  $not: "$$mc"
                }
              }
            }
          }
        }
      }
    ])
    

    Here is the Mongo playground for your reference.

    Login or Signup to reply.
  2. Query1

    • unwind replace root to make each member a root document
    • match the condition to be false
    • group by anima and count

    Playmongo
    (for in/out of each stage you can place the mouse on the end of the stage)

    aggregate(
    [{"$unwind": "$ecuCheckResultList"},
     {"$replaceRoot": {"newRoot": "$ecuCheckResultList"}},
     {"$match": {"$expr": {"$eq": ["$MatchCondition", false]}}},
     {"$group": {"_id": "$animal", "count": {"$sum": 1}}}])
    

    Query2

    • same as the above but filter first to keep only the condition false
      and unwind after

    *probably faster from the previous

    Playmongo

    aggregate(
    [{"$set": 
       {"ecuCheckResultList": 
         {"$filter": 
           {"input": "$ecuCheckResultList",
            "cond": {"$eq": ["$$this.MatchCondition", false]}}}}},
     {"$unwind": "$ecuCheckResultList"},
     {"$group": {"_id": "$ecuCheckResultList.animal", "count": {"$sum": 1}}}])
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search