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.