0

I have a collection. I want to get only those objects of user_surveys array where survey_delete_flag is 0

  {
       "_id":"5d38395531335242147f9341",
       "user_status":"Active",
       "user_surveys":[
          {
             "survey_id":"1563965898505",
             "survey_name":"Deepak Survey",
             "survey_delete_flag":0,
             "survey_status":"Active"
          },
          {
             "survey_id":"1563971438976",
             "survey_name":"Infra Survey",
             "survey_delete_flag":0,
             "survey_status":"Active"
          },
          {
             "survey_id":"1564059777417",
             "survey_name":"Infra2 Survey",
             "survey_delete_flag":1,
             "survey_status":"Active"
          }
        ]
    }

I am using mongodb npm library and tried like below but it's return all document that match with _id only.

  let query = {_id: new objectId(authenication.loggedUser.user_id)}
    let subquery= {user_surveys: {$elemMatch: {survey_delete_flag:0}}}
    survey_db.collection('user_registration').findOne(query,subquery,(err, 
   doc) => {
                if (!err) {
                    console.log(doc)
                    res.json({ res: doc.user_surveys })
                } else {
                    return res.json({ err: err })
                }
     }

I am expecting results like this

[
   {
      "survey_id":"1563965898505",
      "survey_name":"Deepak Survey",
      "survey_delete_flag":0,
      "survey_status":"Active"
   },
   {
      "survey_id":"1563971438976",
      "survey_name":"Infra Survey",
      "survey_delete_flag":0,
      "survey_status":"Active"
   }
]
Deepak
  • 145
  • 2
  • 9

2 Answers2

4

With normal findOne you cannot get result the way you want. For that you have to use aggregation.

Like this

const query = [
    {
        $match: { _id:new objectId(authenication.loggedUser.user_id) }
    },
    {
        $unwind: "$user_surveys"
    },
    {
        $match: { "user_surveys.survey_delete_flag": 0 }
    },
    {
        $replaceRoot: { newRoot: "$user_surveys" }
    }
]

survey_db.collection('user_registration').aggregate(query,(err,  doc) => {
    if (!err) {
        console.log(doc)
        res.json({ res: doc.user_surveys })
    } else {
        return res.json({ err: err })
    }
})

Please refer this for more help : https://docs.mongodb.com/manual/reference/method/db.collection.aggregate/

Jits
  • 545
  • 3
  • 12
0
db.getCollection("user_registration").aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $project: {
                user_surveys: {
                    $filter: {
                        input: "$user_surveys",
                        as: "survey",
                        cond: {
                            $eq: ["$$survey.survey_delete_flag", 0]
                        }
                    }
                }

            }
        },

    ]



);
Rubin Porwal
  • 3,736
  • 1
  • 23
  • 26