如何在 mongodb 中使用 $match 作为可选参数
How to use $match in aggregate in mongodb for optional parameter
我是 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 } ] } },
])
您可以像这样动态构建聚合阶段:
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);
我是 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 } ] } },
])
您可以像这样动态构建聚合阶段:
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);