Как использовать $ match в агрегате в mongodb для необязательного параметра - PullRequest
1 голос
/ 30 октября 2019

Я новичок в mongodb и застрял при использовании функции агрегирования. мой запрос -> Я хочу отфильтровать записи базы данных на основе моего примененного фильтра на панели инструментов. Как я могу добавить значение фильтра с помощью оператора $ match? оно должно применяться при наличии значения фильтра и игнорировать, если оно недоступно.

if (req.body.filterSet !== undefined) {
        const filterData = req.body.filterSet[0];
        var violation_id = filterData.violation_id;
        var start_notice = filterData.start_notice;
        var end_notice = filterData.end_notice;
        var rc_number = filterData.rc_number;
        var circle = filterData.circle;
        var start_date = filterData.start_date;
        var end_date = filterData.end_date;
        var status = filterData.status;
        var source = filterData.source;
        var sms_status = filterData.sms_status;
        var notice_status = filterData.notice_status;
      }
 Complaint.aggregate([
        { $match : { is_active : { $eq : 1 } } },
        { $match : { id : { $eq : 1103186 } } },
        { $lookup:{ from: 'offences', localField:'offences', foreignField: 'offence_id', as: 'offenceSetail' } },
        { $project: { 'offences.is_active' : 0 } },
        { $replaceRoot : { newRoot : { $mergeObjects : [ { $arrayElemAt: [ "$offenceSetail", 0] }, "$$ROOT"] } } },
        { $project: { 'offenceSetail' : 0 } },
        { $lookup: { from: 'registers', localField: 'user_id', foreignField: 'id', as: 'sender'} },
        { $project: { 'registers.is_active' : 0 } },
        { $replaceRoot : { newRoot : { $mergeObjects : [ { $arrayElemAt: ['$sender', 0] }, "$$ROOT"] } } },
        { $project: { 'sender': 0 } },
        { $facet : { length : [ { $count : "total" }], data : [ { $skip: skip }, {$limit: limit } ] } },
      ])

1 Ответ

0 голосов
/ 30 октября 2019

Вы можете динамически построить этапы агрегирования следующим образом:

const stages = [
    { $lookup:{ from: 'offences', localField:'offences', foreignField: 'offence_id', as: 'offenceSetail' } },
    { $project: { 'offences.is_active' : 0 } },
    { $replaceRoot : { newRoot : { $mergeObjects : [ { $arrayElemAt: [ "$offenceSetail", 0] }, "$$ROOT"] } } },
    { $project: { 'offenceSetail' : 0 } },
    { $lookup: { from: 'registers', localField: 'user_id', foreignField: 'id', as: 'sender'} },
    { $project: { 'registers.is_active' : 0 } },
    { $replaceRoot : { newRoot : { $mergeObjects : [ { $arrayElemAt: ['$sender', 0] }, "$$ROOT"] } } },
    { $project: { 'sender': 0 } },
    { $facet : { length : [ { $count : "total" }], data : [ { $skip: skip }, {$limit: limit } ] } }
  ]

if (optional_parameter_exists) {
  stages.unshift(
    { $match: { is_active: { $eq: 1 } } },
    { $match: { id: { $eq: 1103186 } } }
  );
}

Complaint.aggregate(stages);

...