skip to Main Content

I have following json data in mongodb.

[
  {
    "_id": 1,
    "name": "user1",
    "userActivities": [
      {
        "actionTaken": "Sign in.",
        "progress": "Success."
      },
      {
        "actionTaken": "logout",
        "progress": "Success."
      }
    ]
  },
  {
    "_id": 2,
    "name": "user2",
    "userActivities": [
      {
        "actionTaken": "Sign in.",
        "progress": "Success."
      },
      {
        "actionTaken": "logout",
        "progress": "Success."
      }
    ]
  },
  {
    "_id": 3,
    "name": "user3",
    "userActivities": [
      {
        "actionTaken": "Sign in.",
        "progress": "Success."
      },
      {
        "actionTaken": "logout",
        "progress": "Success."
      }
    ]
  },
  {
    "_id": 4,
    "name": "user4",
    "userActivities": [
      {
        "actionTaken": "Sign in.",
        "progress": "Success."
      },
      {
        "actionTaken": "logout",
        "progress": "Success."
      }
    ]
  },
  {
    "_id": 5,
    "name": "user5",
    "userActivities": [
      {
        "actionTaken": "Sign in.",
        "progress": "Success."
      },
      {
        "actionTaken": "logout",
        "progress": "Success."
      }
    ]
  },
  {
    "_id": 6,
    "name": "user6",
    "userActivities": [
      {
        "actionTaken": "Sign in.",
        "progress": "Success."
      },
      {
        "actionTaken": "logout",
        "progress": "Success."
      }
    ]
  },
  {
    "_id": 7,
    "name": "user7",
    "userActivities": [
      {
        "actionTaken": "Sign in.",
        "progress": "Success."
      },
      {
        "actionTaken": "logout",
        "progress": "Success."
      }
    ]
  },
  {
    "_id": 8,
    "name": "user8",
    "userActivities": [
      {
        "actionTaken": "Sign in.",
        "progress": "Success."
      },
      {
        "actionTaken": "logout",
        "progress": "Success."
      }
    ]
  }
]

I am querying data for pagination as following.

[
    {
        "$match": {
            "userActivities": {
                "actionTaken": "Sign in."
            }
        }
    },
    {
        "$sort": {
            "name": -1
        }
    },
    {
        "$project": {
            "name": 1,
            "userActivities": {
                "$filter": {
                    "input": "$userActivities",
                    "as": "userActivities",
                    "cond": {
                        "$eq": [
                            "$$userActivities.actionTaken",
                            "Sign in."
                        ]
                    }
                }
            }
        }
    },
    {
        "$skip": 2
    },
    {
        "$limit": 2
    }
]

But not getting any data even though it matches filter criteria. If I remove progress field from sample data then it gives me data.

Is it something should be done differently when multiple fields are there in column to query?

3

Answers


  1. Chosen as BEST ANSWER

    Got answer by taking help from one person. I had to use $elemMatch as following.

        [
          {
            "$match": {
              "userActivities": {
                "$elemMatch": {
                  "actionTaken": "Sign in."
                }
              }
            }
          },
          {
            "$sort": {
              "name": -1
            }
          },
          {
            "$project": {
              "name": 1,
              "userActivities": {
                "$filter": {
                  "input": "$userActivities",
                  "as": "userActivities",
                  "cond": {
                    "$eq": ["$$userActivities.actionTaken", "Sign in."]
                  }
                }
              }
            }
          },
          {
            "$skip": 2
          },
          {
            "$limit": 2
          }
        ]
    

  2. Use dot notation in your $match stage.

    {
      "$match": {
        "userActivities.actionTaken": "Sign in."
      }
    }
    

    Sample Mongo Playground

    Login or Signup to reply.
  3. Maybe add the "progress" in your match stage otherways you match only objects with the single field actionTaken that do not exist in the collection :

     {
      "$match": {
        "userActivities": {
          "actionTaken": "Sign in.",
          "progress": "Success."
        }
      }
     }
    

    Sample Mongo Playground

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search