Mongoose无效的操作员$匹配



我将根据email_address,firstName,lastName,type和phone_number处理用户搜索。

phone_number搜索将与&没有国家代码,而其他代码将包含&案例不敏感的搜索。

所以,我写了以下代码。

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 });
    }
);

但是,当我运行此代码时,我会得到"无效的运算符'$ match'"错误。

如果我删除了$匹配,它将评估req.body值为表达式而不是值,并发出" fieldpath'ABC'不会以$ $"的方式出现。

所以,我希望能为解决这个问题和条件搜索提供帮助。

请帮助我!

移动 $match 外部 $redact ,它是一个独立的管道阶段,它将提供最初的过滤器,否则可以将其提供给我 $redact 管道中无效:

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 });
    }
);

最新更新