mongodb - 如何动态构建mongodb查询

标签 mongodb mongodb-query aggregation-framework

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

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

$match: {
    "school._id": "7011",
    "studentGradeLevels": { $in: ["09", "10", "11", "12"] },
    "contentArea": {
        $in: [
            "English 1"
        ]
    }
}

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

最佳答案

您可以使用$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
    }
}])

关于mongodb - 如何动态构建mongodb查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42315649/

相关文章:

mongodb - NoSQL关键字在大表中搜索

c# - mongoDB C# 驱动程序未返回任何数据

node.js - 如何获取引用的Object的所有值?

angularjs - Angular没有显示响应数据

MongoDB 使用链接对象聚合管道

node.js - 如何使用 mongoose 定义单个引用模式

debugging - mongodb:如何在 mongodb shell 上调试 map/reduce

php - 在 Mongodb 中聚合嵌套数组

mongodb - 在 mongo 聚合 $lookup 查询中使用数组第一个字段来匹配文档

python - 如果 Mongo 中两个日期之间存在任何数据,则返回 true 或 false