【问题标题】:Convert JSON query conditions to MongoDB/Mongoose operations将 JSON 查询条件转换为 MongoDB/Mongoose 操作
【发布时间】:2019-07-18 17:23:55
【问题描述】:

我正在客户端使用 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"
        }
      ]
    }
  ]
}

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    您需要构建 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 }]);
    

    【讨论】:

    • 非常感谢这个作品!您能否帮助扩展它以支持嵌套的子文档数组?当它可用时,我会很高兴打开另一个赏金。相关问题:stackoverflow.com/questions/57259343/…
    • @pengz 今天晚些时候我会尝试看看,谢谢
    猜你喜欢
    • 2011-05-23
    • 2020-02-22
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多