javascript - 将 JSON 查询条件转换为 MongoDB/Mongoose 操作

标签 javascript node.js mongodb mongoose

我正在客户端使用 Angular 8 和服务器端使用 MongoDB 4/Mongoose 5 的 NodeJS 12 构建应用程序。

我有一个由 Angular query builder module 生成的查询以 JSON 格式。 JSON 对象将通过 POST 请求发送到后端。

问题: JSON 查询如何转换成 MongoDB 操作符来执行数据库查询?

这是一个由查询生成器插件生成的简单查询的示例。请注意对“嵌套”AND/OR 条件的多个级别的要求。

{
  "condition": "and",
  "rules": [
    {
      "field": "Brief_D_Reactiedatum",
      "operator": "!=",
      "value": "Eventtoets_Fn"
    },
    {
      "condition": "or",
      "rules": [
        {
          "field": "Alleen_AO",
          "operator": "=",
          "value": "Parkeerreden"
        }
      ]
    }
  ]
}

最佳答案

您需要构建 MongoDB 的 $expr这类似于您从 Angular 查询构建器模块 获得的查询。由于规则集可以嵌套,因此您需要递归地运行映射函数。下面的代码可能不会涵盖所有可能的情况,但应该为您提供一个很好的介绍,以便开始使用这种映射。

let q = {
  "condition": "and",
  "rules": [
    {
      "field": "Brief_D_Reactiedatum",
      "operator": "!=",
      "value": "Eventtoets_Fn"
    },
    {
      "condition": "or",
      "rules": [
        {
          "field": "Alleen_AO",
          "operator": "=",
          "value": "Parkeerreden"
        }
      ]
    }
  ]
};

const conditions = { "and": "$and", "or": "$or" };
const operators = { "=": "$eq", "!=": "$ne", "<": "$lt", "<=": "$lte", ">": "$gt", ">=": "$gte" };

const mapRule = rule => ({
    [operators[rule.operator]]: [ "$"+rule.field, rule.value ]
});

const mapRuleSet = ruleSet => {
    return {
        [conditions[ruleSet.condition]]: ruleSet.rules.map(
            rule => rule.operator ? mapRule(rule) : mapRuleSet(rule)
        )
    }
};

let mongoDbQuery = { $expr: mapRuleSet(q) };
console.log(mongoDbQuery);

结果表达式可以传递给 MongoDB 的 find 方法

db.col.find(mongoDbQuery);

或进入 $match流水线阶段:

db.col.aggregate([{ $match: mongoDbQuery }]);

关于javascript - 将 JSON 查询条件转换为 MongoDB/Mongoose 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57099793/

相关文章:

javascript - 如何强制 TypeScript 导出到 JS 输出的末尾?

javascript - 使用 Javascript 手动插入 ObjectId

javascript - 优先考虑正则表达式中的组

javascript - nodejs Q.all promise 函数调用自身

python - 使用 Mongodb 在 Python Flask 应用程序中查找返回空游标的查询

javascript - 如何将捕获的签名图像保存到 MySQL

node.js - 如何在 WebStorm 中使用 TypeScript 调试用 Node.js 编写的后端

javascript - express deprecated res.sendfile : Use res. sendFile 代替

node.js - mongo 可以 upsert 数组数据吗?

mongodb - 为什么 MongoDB 副本集中的最大节点数恰好是 12?