如何动态构建mongodb查询

RUE*_*INE 2 mongodb mongodb-query aggregation-framework

我在 mongodb 聚合中有一个匹配表达式。匹配中包含 3 个字段,但它们并不总是包含数据。我只想在字段不为空时将字段包含在匹配中。

如果所有字段都有数据,则匹配的样子,但例如,如果用于的数组为studentGradeLevels空,那么我不想包含它,或者我希望查询仍然返回数据而忽略空参数。

$match: {
    "school._id": "7011",
    "studentGradeLevels": { $in: ["09", "10", "11", "12"] },
    "contentArea": {
        $in: [
            "English 1"
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法动态构建匹配,以便我只包含我想要的字段(如果它们为空或不为空),或者在查询中执行某些操作,以便忽略空参数。

Ber*_*tel 5

$in当数组不为空时可以使用,$nin当数组为空时可以使用,这样匹配字段就不会被考虑在内($nin : []):

function buildMatch(arr) {
    var matcher = {};
    if (arr.length == 0)
        matcher["$nin"] = arr;
    else
        matcher["$in"] = arr;
    return matcher;
}

var grades = ["09", "10", "11", "12"];
var areas = [ "English 2" ];

var gradeMatch = buildMatch(grades);
var areaMatch = buildMatch(areas);

db.students.aggregate([{
    $match: {
        "school._id": "7011",
        "studentGradeLevels": gradeMatch,
        "contentArea": areaMatch
    }
}])
Run Code Online (Sandbox Code Playgroud)