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

2024-04-06

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

我有一个由以下生成的查询角度查询构建器模块 https://www.npmjs.com/package/angular2-query-builderJSON 格式。 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 https://docs.mongodb.com/manual/reference/operator/query/expr/这与您收到的查询类似角度查询构建器模块。由于规则集可以嵌套,因此您需要递归地运行映射函数。下面的代码可能没有涵盖所有可能的情况,但应该为您提供一个很好的介绍,以便您开始使用此类映射。

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);

结果表达式可以传递给 MongoDBfind method

db.col.find(mongoDbQuery);

or into $match https://docs.mongodb.com/manual/reference/operator/aggregation/match/index.html管道阶段:

db.col.aggregate([{ $match: mongoDbQuery }]);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 JSON 查询条件转换为 MongoDB/Mongoose 操作 的相关文章

随机推荐

  • SQL“float”数据类型在作为 XML 输出时会导致不需要的浮点结果

    您可以简单地尝试 table1 有一个类型为 float 的column1 代替 SELECT column1 from Table1 给出如表中所示的值 假设返回 15 1 但是 如果你尝试 Select column1 from Tab
  • GridSearchCV 历史最佳模型 CV

    我正在尝试将 GridSearchCV 与 KerasRegressor 一起使用进行超参数搜索 Keras model fit 函数本身允许使用历史对象查看 loss 和 val loss 变量 使用 GridSearchCV 时是否可以
  • Python:有什么方法可以声明常量参数吗?

    我有一个方法 def foo bar 有没有办法标记bar作为常数 例如 价值在bar不能改变 或 所指向的对象bar不能变 如果 bar 是不可变对象 则 bar 在函数执行期间不会改变 您还可以创建自己的常量对象 食谱在这里 http
  • 设置 元素的背景颜色(高度未设置为 100%)适用于整个视口

    我发现为整个设置背景颜色元素 高度未设置为 100 导致整个视口设置为该颜色 这个html 1 br 2 br 3
  • C++ 构建系统 - 使用什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在考虑用 C 启动一个新项目 最初是在我自己的时间 并且我正在研究可用的构建系统 答案似乎是 很多
  • 在 Java 中开发具有插件支持的应用程序

    我一直在研究如何开发一个可以加载插件的应用程序 到目前为止 我已经看到这可以通过定义一个接口来完成 并让插件实现它 然而 我当前的问题是如何加载打包在 Jars 中的插件 有没有 最好 的方法来做到这一点 我当前想到的逻辑是获取每个插件并在
  • Solr - 从数据库导入日期时间字段 -> 2 小时差异

    我正在 Solr 中导入日期时间列 SQLServer 并且 solr 中的值始终比数据库中早 2 小时 并且具有完整导入和增量导入 我已经用正确的时间配置了jvm 在日志中它显示了正确的时间 我想我必须在 data config xml
  • 使用acts_as_taggable_on 搜索表单 (Rails 3)

    我有一个搜索框来搜索产品 每个产品都有一个标题并标有多个标签 我希望能够按标题或标签搜索产品 换句话说 如果我有一个名为 绿茶 的产品和另一个标记为 绿色 红色 蓝色 的产品 并且我在搜索框中输入 绿色 我希望这两种产品都出现在搜索结果中
  • 将具有不同格式的文本文件读取到 MATLAB

    我有一个文本文件 但不幸的是它的格式很差 但是我想将文本文件的内容读入矩阵 但我不知道该怎么做 当尝试使用fscanf textscan textread其余的它只是将所有内容复制到一个单元格中 但我不希望那样 内容如下 所以我只想读取小数
  • Rake:记录任何正在执行的任务

    如何在不更改任务源的情况下为每个 rake 任务创建数据库日志记录 我需要存储日期时间 任务名称 参数 有某种观察者等吗 您可以覆盖Rake Task invoke中的方法application rb application rb modu
  • 使用错误:未找到行魔术函数“%sql”

    reload ext sql sql sqlite 第二行无法编译 报告显示 UsageError Line magic function sql未找到 用Python3 8 jupyter笔记本 我使用 conda 安装 ipython
  • 测量库调用和回调之间的时间

    你好 在 iPhone 应用程序中 我使用一个库 C 它在计算完成时异步进行回调 现在我想测量在进行回调之前所花费的时间 包括调用库的方法 是否有可能使用 Apple 的 Instruments 应用程序来做到这一点 最佳实践是什么 过去
  • C++ 跨文件引用变量

    我有一个项目 需要在另一个 CPP 文件中引用一个 CPP 文件中声明的变量 这可能吗 如果是这样 怎么办 如果您将其声明为全局 顶级 位于任何函数定义之上 并使用 extern 这是可能的放在其他文件中以使编译器知道 Main cpp i
  • Ruby Mongodb 驱动程序 $gt 在日期条件下充当 $gte,为什么?

    我有一个奇怪的情况 gt and gteruby mongodb 驱动程序中的条件 所以这是代码 timeline timeline db find date gt gt s time username in gt followers ar
  • 如何在 Perl 中替换现有文件中的字符串

    我想在名为 1 classification dat 2 classification dat 等的所有文本文件中将 蓝色 一词替换为 红色 我想编辑同一个文件 所以我尝试了以下代码 但它不起作用 我哪里出错了 files glob cla
  • 使用python更改Windows快捷方式.lnk文件的图标

    我想更改a的图标 lnk我创建后的文件 到目前为止 这是我的主要代码 import win32com client shell win32com client Dispatch WScript Shell shortcut shell Cr
  • 如何使用 Python 3.4.2 在 Windows 7 中安装 scipy

    我安装时遇到问题scipy 当我跑步时 python m pip install scipy 我收到以下消息 C Python34 lib site packages pip main py run on 01 14 15 15 56 16
  • 如何检测flutter webview中内部html何时发生变化

    我在用着webview flutter https pub dev packages webview flutter要从 Flutter 应用程序上的 URL 查看页面 我需要做的是检测 HTML 代码中何时发生更改 而不更改 URL 因为
  • 在 Swift 中的一处导入整个项目的框架?

    我自己做了一个Cocoa Touch Framework 并且我只想将其导入到代码中的一处 在 Xcode Objective C 的早期版本中 有一个中心位置位于Supporting Files 它如何适用于基于 Swift 的项目 创建
  • 将 JSON 查询条件转换为 MongoDB/Mongoose 操作

    我正在客户端使用 Angular 8 构建一个应用程序 在服务器端使用 NodeJS 12 和 MongoDB 4 Mongoose 5 构建一个应用程序 我有一个由以下生成的查询角度查询构建器模块 https www npmjs com