mongoose无效的运营商$匹配

我将根据email_address,firstname,lastname,type和phone_number来处理用户search。

电话号码search将精确search与国家代码,而其他人将包含&区分大小写的search。

所以,我写了下面的代码。

User.aggregate( [ { "$redact": { "$cond": [ { "$and": [ { "$match": { type: req.body.type, email_address: new RegExp((req.body.email_address || req.body.any || '').toLowerCase(), "i"), "firstname": new RegExp((req.body.firstname || req.body.any || '').toLowerCase(), "i") , "lastname": new RegExp((req.body.lastname || req.body.any || '').toLowerCase(), "i") } }, { "$or": [ { "$setIsSubset": [ [ { "$substr": [ "$phone_number.local_number", 0, -1 ] } ], [req.body.phone_number, req.body.any] ] }, { "$setIsSubset": [ [ { "$concat": [ { "$substr": [ "$phone_number.country_code", 0, -1 ] }, { "$substr": [ "$phone_number.local_number", 0, -1 ] } ] } ], [req.body.phone_number, req.body.any] ] }, {} ] } ] }, "$$KEEP", "$$PRUNE" ] } } ], function(err, users) { if (err) { return res.json({ success: false, err: err }); } res.json({ success: true, users: users }); } ); 

但是,当我运行这个代码,我得到“无效的运营商'匹配'”错误。

如果我删除$匹配,它将req.body值作为expression式而不是值来计算,并发出“FieldPath”abc“不以$”types错误开始。

所以,我希望得到如何解决这个问题和条件search的帮助。

请帮帮我 !!!

$redact之外移动$match因为它是一个独立的stream水线阶段,它将为初始filter提供正则expression式,否则在$redactpipe道中可能无效:

 User.aggregate([ { "$match": { "type": req.body.type, "email_address": new RegExp((req.body.email_address || req.body.any || '').toLowerCase(), "i"), "firstname": new RegExp((req.body.firstname || req.body.any || '').toLowerCase(), "i") , "lastname": new RegExp((req.body.lastname || req.body.any || '').toLowerCase(), "i") } }, { "$redact": { "$cond": [ { "$or": [ { "$setIsSubset": [ [ { "$substr": [ "$phone_number.local_number", 0, -1 ] } ], [req.body.phone_number, req.body.any] ] }, { "$setIsSubset": [ [ { "$concat": [ { "$substr": [ "$phone_number.country_code", 0, -1 ] }, { "$substr": [ "$phone_number.local_number", 0, -1 ] } ] } ], [req.body.phone_number, req.body.any] ] } ] }, "$$KEEP", "$$PRUNE" ] } } ], function(err, users) { if (err) { return res.json({ success: false, err: err }); } res.json({ success: true, users: users }); } );