0

How can i use $match with lookup document

document - feedbacks

[
  {id: 1, post:'post 1', user_id:101, reply_by: 1 },
  {id: 2, post:'post 2', user_id:101, reply_by: 2 },
  {id: 3, post:'post 3', user_id:102, reply_by: 1 },
  {id: 4, post:'post 4', user_id:103, reply_by: 1 }
]

document - users

[
 {id:1, name: 'Vicky', username:'vicky@test.com'},
 {id:2, name: 'Vikash', username:'vikash@test.com'},
 {id:3, name: 'Vishesh', username:'vishesh@test.com'}
]

document - registers

[
 {id:1, name: 'User 1', username:'user1@test.com', phoneNumber: '1234567890'},
 {id:2, name: 'User 2', username:'user2@test.com', phoneNumber: '9876543210'},
 {id:3, name: 'User 3', username:'user3@test.com', phoneNumber: '3456234567'}
]
 getFeedbackList(req, res) {
    const pageNo = parseInt(req.body.page_no);
    const pageSize = parseInt(req.body.page_size);
    if (req.body.filterSet !== undefined) {
      const filterData = req.body.filterSet[0];
      var start_date = filterData.start_date;
      var end_date = filterData.end_date;
      var status = filterData.status;
      var number = filterData.number;
    }
    const skip = pageSize * (pageNo - 1);
    const limit = pageSize;
    const stages = [
      { $sort : { created_at : -1 } },

      { $lookup: { from: 'registers', localField: 'user_id', foreignField: 'id', as: 'sender'} },
      { $replaceRoot : { newRoot : { $mergeObjects : [ { $arrayElemAt: ['$sender', 0] }, "$$ROOT"] } } },

      { $lookup: { from: 'users', localField: 'reply_by', foreignField: 'id', as: 'userDetails'} },
      { $replaceRoot: { newRoot: { $mergeObjects: [ { $arrayElemAt: ['$userDetails', 0] }, "$$ROOT" ] } } },

      { $project: { 'sender': 0, 'userDetails' : 0 } },

      { $facet : { length : [ { $count : "total" }], data : [ { $skip: skip }, {$limit: limit } ] } },
    ];

    if(start_date !== 'Invalid date' && start_date !== undefined && start_date !== ''){
      stages.unshift(
        { $match : { created_at: { $gte: start_date } } }
      )
    }
    if(end_date !== 'Invalid date' && end_date !== undefined && end_date !== ''){
      stages.unshift(
        { $match : { created_at: { $lte: end_date } } }
      )
    }
    if(status != null && status != ''){
      if(status == '1' ) {
        stages.unshift(
          { $match : { reply: { $exists: true} } }
        )
      }
      if(status == '0' ) {
        stages.unshift(
          { $match : { reply: { $exists: false} } }
        )
      }
    }

    Feedback.aggregate(stages).allowDiskUse(true).then(document => {
      console.log(document);
    }).catch(error => {
      console.log(error);
      return res.status(400).json({
        status:400,
        message:'Something went wrong. Pleae try again'
      });
    });
  }

My question is how can I write condition for phoneNumber, but condition is it should add in $match operator when only phoneNumber is available. I tried by adding as i added for start_date, end_date or status, but when i used to add for phoneNumber it match with feedback document instead of registers document.

Vicky Kumar
  • 239
  • 7
  • 21
  • you can use the `pipeline` option of `$lookup` and define the condition in there as an example take a look at[Mongodb aggregation lookup with conditions](https://stackoverflow.com/a/48519147/2417602) and more about [$lookup](https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/index.html#join-conditions-and-uncorrelated-sub-queries) – vikscool Dec 02 '19 at 05:58
  • @vikscool: I tried but did not work, Please suggest something different. – Vicky Kumar Dec 02 '19 at 06:13

0 Answers0