我正在尝试建立动态的$ match:为我的MongoDB聚合

这是我希望可以做的:

var matchStr = "";
if (req.body.propertyID) {
    matchStr += "property: { $in: properties },"
}
if (req.body.status=="ACTIVE" || req.body.status=="NOPAY") {
    matchStr += "status : {$lte: 4},"
} else if (req.body.status) {
    matchStr += "status : {$lte: req.body.status},"
}
matchStr += "checkin : {$gte: (checkin)}, checkout: {$lte: (checkout)}"


这就是我最终要做的事情:

它是如此混乱,现在我必须在$ match中添加更多的语句,如果使用结构,这将使我更大。

必须有一个更好的方法来做到这一点!

我希望外面有人知道如何动态构建这些,而无需“ if hell :)”

if (req.body.propertyID & req.body.status=="ALL") {
    var matchStr = {
        $match: {
            $and:
            [{
                property: { $in: properties },
                checkin : {$gte: (checkin)},
                checkout: {$lte: (checkout)}
            }]
        }
    }
} else if (!req.body.propertyID & !req.body.status) {
    var matchStr = {
        $match: {
            $and:
            [{
                checkin : {$gte: (checkin)},
                checkout: {$lte: (checkout)}
            }]
        }
    }
} else if ((req.body.status=="ACTIVE" || req.body.status=="NOPAY")) {
    if (req.body.propertyID) {
        var matchStr = {
            $match: {
                $and:
                [{
                    property: { $in: properties },
                    status : {$lte: 4},
                    checkin : {$gte: (checkin)},
                    checkout: {$lte: (checkout)}
                }]
            }
        }
    } else {
        var matchStr = {
            $match: {
                $and:
                [{
                    status : {$lte: 4},
                    checkin : {$gte: (checkin)},
                    checkout: {$lte: (checkout)}
                }]
            }
        }
    }
} else {
    if (req.body.propertyID) {
        var matchStr = {
            $match: {
                $and:
                [{
                    property: { $in: properties },
                    status : {$lte: req.body.status},
                    checkin : {$gte: (checkin)},
                    checkout: {$lte: (checkout)}
                }]
            }
        }
    } else {
        var matchStr = {
            $match: {
                $and:
                [{
                    status : {$lte: req.body.status},
                    checkin : {$gte: (checkin)},
                    checkout: {$lte: (checkout)}
                }]
            }
        }
    }
}


更新! -现在几乎可以理解了,除了将“ myMatch”放在mongoDB语句中。

这是新代码:

var myMatch = {
    checkin: {$gte: checkin},
    checkout: {$lte: checkout}
};

if (req.body.hasOwnProperty('propertyID')) {
    var properties = req.body.propertyID.map(function (obj) {
        return obj._id;
    });
    console.log("properties: " + properties);
    myMatch["property"] = { "$in": properties };
}
if (req.body.status=="ACTIVE" || req.body.status=="NOPAY") {
    myMatch["status"] = { "$lte": 4 };
} else if (req.body.hasOwnProperty('status')) {
    myMatch["status"] = { "$lte": +req.body.status };
}


这是该结构的控制台日志:

myMatch: {
    "checkin": {
        "$gte": 1473571600
    },
    "checkout": {
        "$lte": 1596163600
    },
    "property": {
        "$in": [
            "PAP-720",
            "ATL-D406",
            "WAT-606"
        ]
    },
    "status": {
        "$lte": 3
    }
}


这是我注入myMatch对象的地方:

    bookingTable.aggregate([
        {
            $match: {
                $and:
                [{
                    myMatch
                }]
            }
        },


这是最后的mongodb语句:

Mongoose:
booking.aggregate([
{ '$match': { '$and': [ { myMatch: { checkin: { '$gte': 1473571600 }, checkout: { '$lte': 1596163600 }, property: { '$in': [ 'PAP-720', 'ATL-D406', 'WAT-606' ] }, status: { '$lte': 3 } } } ] } },

最佳答案

您真正需要注意的第一件事是,几乎不需要编写显式的$and语句。它有用法,但是通常MongoDB查询中的所有表达式已经是“ AND”操作。

接下来的事情是该解决方案看起来非常熟悉:

var myMatch = {
    checkin: checkin,
    checkout: checkout
};

if (req.body.propertyID) {
    myMatch["property"] = { "$in": properties };
}
if (req.body.status=="ACTIVE" || req.body.status=="NOPAY") {
    myMatch["status"] = { "$lte": 4 };
} else if (req.body.hasOwnProperty('status')) {
    myMatch["status"] = { "$lte": +req.body.status };
}


属性名称很正常,因此您可以选择执行以下操作:

    myMatch.property = { "$in": properties };


但这归结为对JavaScript对象的基本操作。在任何动态类型的语言中,它几乎都是相同的。

然后,您可以稍后再执行以下操作:

{ "$match": myMatch }


它完成了。

关于javascript - 构建动态$ match:用于MongoDB聚合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44109521/

10-11 12:54
查看更多