首页/新闻资讯/正文详情

MikroORM JSON 属性实战指南:定义、查询、$elemMatch 与索引

发布时间:2026/9/27 8:42:37 来源:云帆数科 栏目:资讯中心
MikroORM JSON 属性实战指南:定义、查询、$elemMatch 与索引
后端【免费下载链接】mikro-ormTypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, MariaDB, MS SQL Server, PostgreSQL and SQLite/libSQL databases.项目地址https://gitcode.com/gh_mirrors/mi/mikro-orm点击查看免费下载本篇技术指南围绕 MikroORM基于 Data Mapper、Unit of Work 与 Identity Map 模式的 TypeScript ORM中JSON 属性的完整使用链路展开从实体中定义 JSON 字段、按 JSON 对象属性查询、对 JSON 数组使用$elemMatch到为 JSON 属性创建索引内容以 docs/versioned_docs/version-5.9/json-properties.mdv5.9 版本文档为主体骨架并结合当前仓库packages/core与packages/sql的源码实现进行纵深印证。读完本文你将能直接在项目中使用type: json字段并写出跨 PostgreSQL / MySQL / MariaDB / SQLite / MongoDB / MSSQL 等驱动统一语义的 JSON 查询。定义 JSON 属性不同数据库驱动对 JSON 列的处理方式差异很大有些驱动如 MongoDB、PostgreSQL 的jsonb会自动把查询结果解析为 JavaScript 对象另一些驱动则返回 JSON 字符串。MikroORM 通过统一的 JsonTypeTypeunknown, string | null来抹平这些差异——只要在Property中指定type: jsonORM 就会自动选用该类型。Entity() export class Book { Property({ type: json, nullable: true }) meta?: { foo: string; bar: number }; }从 JsonType 源码可以看到它的核心职责convertToDatabaseValue写入数据库时把 JS 对象交给platform.convertJsonToDatabaseValue序列化convertToJSValue读取时先判断当前驱动是否convertsJsonAutomatically()见 Platform.ts默认返回true如果驱动本身已自动解析 JSON 列就直接返回原值避免重复JSON.parsegetColumnType列类型统一交给platform.getJsonDeclarationSQL()例如 PostgreSQL 平台返回jsonb见 BasePostgreSqlPlatform.ts其余驱动默认是json。按 JSON 对象属性查询该能力自 v4.4.2 起加入v5.9 完全支持。可以在findOne/find的查询条件中直接使用嵌套对象匹配 JSON 内部结构const b await em.findOne(Book, { meta: { valid: true, nested: { foo: 123, bar: 321, deep: { baz: 59, qux: false, }, }, }, });在 PostgreSQL 上会生成如下 SQL路径逐层用-/-展开字符串取文本、数字与布尔值自动加类型转换select e0.* from book as e0 where (meta-valid)::bool true and meta-nested-foo 123 and (meta-nested-bar)::float8 321 and (meta-nested-deep-baz)::float8 59 and (meta-nested-deep-qux)::bool false limit 1该能力目前覆盖所有驱动包括 SQLite 与 MongoDB。在 PostgreSQL 上当右侧值为 number 或 boolean 时ORM 会尝试对提取结果做类型转换。这条查询链路的底层实现在 QueryHelper.ts当属性是JsonType且条件值是普通对象非$eq/$elemMatch开头时会调用processJsonCondition递归地把每个键展开成 JSON 路径随后各平台通过getSearchJsonPropertyKey生成具体 SQL 片段。以 PostgreSQL 为例BasePostgreSqlPlatform.ts字符串类型的叶子用-取文本数字 / 布尔值通过#jsonTypeCasts映射表生成::float8、::bool等显式转换路径中间层用-连接键名一律安全引用防止 SQL 注入。使用$elemMatch查询 JSON 数组元素当 JSON 属性存放的是对象数组时可用$elemMatch操作符针对数组中的单个元素属性做查询。MikroORM 会生成EXISTS子查询并针对各平台选择对应的 JSON 数组展开函数PostgreSQL 用jsonb_array_elements、MySQL/MariaDB 用json_table、SQLite 用json_each。查询值的类型会被自动推断无需额外 schema 提示Entity() export class Event { Property({ type: json, nullable: true }) tags?: { name: string; priority: number }[]; } // 找出带 typescript 标签的事件 const events await em.find(Event, { tags: { $elemMatch: { name: typescript } }, }); // 数值条件自动完成类型转换如 postgres 上的 ::float8 const events await em.find(Event, { tags: { $elemMatch: { priority: { $gt: 5 } } }, }); // 多个条件必须命中同一个数组元素 const events await em.find(Event, { tags: { $elemMatch: { name: typescript, priority: { $gte: 8 } } }, }); // $or/$and/$not 在 $elemMatch 内部同样可用 const events await em.find(Event, { tags: { $elemMatch: { $or: [{ name: typescript }, { name: rust }] } }, });$elemMatch还可以通过$and与数组级操作符组合使用const events await em.find(Event, { $and: [ { tags: { $elemMatch: { priority: { $gt: 5 } } } }, { tags: { $contains: [{ name: typescript }] } }, ], });对于嵌入数组属性由于 ORM 已从 embeddable 元数据中获知元素 schema元素级查询可以隐式进行无需显式$elemMatch。仓库中的端到端测试 tests/features/embeddables/json-elem-match.test.ts 在 sqlite / mysql / mariadb / postgresql / mssql / oracledb 六种驱动上统一验证了该行为关键结论包括EXISTS语义tags为null或空数组的事件不会命中由EXISTS子查询天然处理同元素约束{ name: typescript, priority: { $lt: 3 } }这类跨条件组合要求同一元素同时满足——测试中typescript的 priority 为 10因此返回 0 条$not否定$elemMatch: { $not: { name: typescript } }匹配至少含一个非 typescript 标签的事件安全防护在非 JSON 属性上使用$elemMatch会抛错包含x; DROP TABLE event --这类非法属性名的查询会抛出Invalid JSON property name键名均被安全引用safely quoted不存在注入风险。源码层面QueryHelper.ts 在判定 JSON 条件时把$eq/$elemMatch排除在普通对象之外从而让它们走常规操作符处理路径DatabaseDriver.ts 则显式允许$exists、$ne、$eq、$elemMatch、$all作为 JSON 属性内部的操作符。为 JSON 属性创建索引借助实体级Index()装饰器 点路径dot path可以为 JSON 属性内部的字段建立索引Entity() Index({ properties: metaData.foo }) Index({ properties: [metaData.foo, metaData.bar] }) // 复合索引 export class Book { Property({ type: json, nullable: true }) metaData?: { foo: string; bar: number }; }在 PostgreSQL 上生成的索引 DDL 大致如下create index book_meta_data_foo_index on book ((meta_data-foo));唯一索引使用Unique()装饰器写法一致Entity() Unique({ properties: metaData.foo }) Unique({ properties: [metaData.foo, metaData.bar] }) // 复合唯一索引 export class Book { Property({ type: json, nullable: true }) metaData?: { foo: string; bar: number }; }MySQL 上还可以通过options显式指定生成表达式returning char(200)用于控制表达式索引的返回类型Entity() Index({ properties: metaData.foo, options: { returning: char(200) } }) export class Book { Property({ type: json, nullable: true }) metaData?: { foo: string; bar: number }; }生成的 DDL 如下alter table book add index book_meta_data_foo_index((json_value(meta_data, $.foo returning char(200))));注意MariaDB 驱动不支持该特性。索引生成同样由平台层实现支撑Platform.getJsonIndexDefinitionPlatform.ts的默认实现原样返回列名PostgreSQL 平台覆写该方法BasePostgreSqlPlatform.ts把metaData.foo这样的点路径转换为(meta_data-foo)表达式索引路径中间层用-、叶子用-与查询条件的生成规则保持一致。总结与适用边界定义 JSON 字段统一使用Property({ type: json })由JsonType 各平台getJsonDeclarationSQL决定实际列类型PostgreSQL 为jsonb按 JSON 对象属性查询时嵌套对象会被自动展平为路径表达式PostgreSQL 会对 number / boolean 做类型转换JSON 数组查询使用$elemMatch多条件命中同一元素支持$or/$and/$not/$in可与$contains等数组级操作符通过$and组合索引与唯一索引通过实体级Index/Unique 点路径声明MariaDB 驱动除外本文示例以 v5.9 文档为准$elemMatch与 JSON 索引相关能力在后续版本v6/v7中持续演进可在 docs/docs/json-properties.md 查阅最新版本文档。赞分享后端【免费下载链接】mikro-ormTypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, MariaDB, MS SQL Server, PostgreSQL and SQLite/libSQL databases.项目地址https://gitcode.com/gh_mirrors/mi/mikro-orm点击查看免费下载相关推荐MikroORM JSON 属性实战指南定义、查询、$elemMatch 与索引MikroORM JSON 属性实战指南定义、查询、$elemMatch 与索引 导读 本文是 MikroORM 官方文档 JSON Properties h后端MikroORM 中的 JSON 属性定义、按对象属性查询与索引实战指南MikroORM 中的 JSON 属性定义、按对象属性查询与索引实战指南 本文基于 MikroORM 6.6 版本文档 docs/versioned_doc后端如何永久保存微信聊天记录WeChatMsg开源工具完整指南如何永久保存微信聊天记录WeChatMsg开源工具完整指南 你是否曾因为换手机而丢失珍贵的聊天记录那些与家人的温馨对话、重要的商务沟通、朋友的深夜畅谈是否上一篇CANN/ge RT2运行时约束规范下一篇TorchMetrics完全指南5分钟掌握PyTorch机器学习评估利器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

Monorepo 循环依赖拓扑检测器:基于 Tarjan 强连通分量算法
Monorepo 循环依赖拓扑检测器:基于 Tarjan 强连通分量算法

Monorepo 循环依赖拓扑检测器:基于 Tarjan 强连通分量算法在现代大前端超大型代码仓库(Monorepo / pnpm workspace, Turborepo, Nx, Lerna)工程化实践中,随着业务子包数量突破 50 个,最令基础架构架构师感到绝望的恶性… · 2026/9/27 8:42:31

PSR-7 流工具方法完全指南:guzzlehttp/psr7 中 Utils 的创建、复制、哈希与安全读取
PSR-7 流工具方法完全指南:guzzlehttp/psr7 中 Utils 的创建、复制、哈希与安全读取

后端 【免费下载链接】psr7 PSR-7 HTTP message library 项目地址: https://gitcode.com/gh_mirrors/ps/psr7 点击查看 免费下载 PSR-7 规定 HTTP 消息的请求体与响应体统一以 StreamInterface 流的形式存在,而 guzzlehttp/psr7 通过 GuzzleHttp\Psr7\U… · 2026/9/27 8:42:31

Node.js中的慢SQL排查与索引覆盖调优:DrizzleORM实战
Node.js中的慢SQL排查与索引覆盖调优:DrizzleORM实战

Node.js中的慢SQL排查与索引覆盖调优:DrizzleORM实战在现代 TypeScript / Node.js 全栈后端开发中,Drizzle ORM 凭借其“极致轻量(0 依赖)、100% 强类型推导与贴近原生 SQL 的设计哲学”,成为了替代庞大 Prisma 的新一… · 2026/9/27 8:42:25

Graylog 前端组件 ExternalLinkButton 使用指南:在 React 界面中渲染外部资源按钮
Graylog 前端组件 ExternalLinkButton 使用指南:在 React 界面中渲染外部资源按钮

日志分析运维观测 【免费下载链接】graylog2-server Free and open log management 项目地址: https://gitcode.com/gh_mirrors/gr/graylog2-server 点击查看 免费下载 导读 ExternalLinkButton 是 Graylog Web 前端(graylog2-web-interface&#xff0… · 2026/9/27 9:22:06

10年实战揭秘:wordpresshestiapro怎么选不踩坑?
10年实战揭秘:wordpresshestiapro怎么选不踩坑?

10年实战揭秘:wordpresshestiapro怎么选不踩坑? 改个需求建站公司拖一周,这种痛苦我见得太多了。很多老板以为只要把代码扔给外包,就能坐等上线,结果陷入无尽的扯皮。其实,wordpresshestiapro 这类基于… · 2026/9/27 9:22:00

网站设计制作哪些环节最易被黑?保姆级建站教程避坑指南
网站设计制作哪些环节最易被黑?保姆级建站教程避坑指南

网站设计制作哪些环节最易被黑?保姆级建站教程避坑指南 网站做好了没人访问,这往往不是SEO的问题,而是你的站根本打不开,或者刚上线就被挂马了。很多刚入行的后端开发或者独立站运营者,总觉得“功能实现”才是核心,却忽略了 网站设计制作哪些… · 2026/9/27 9:22:00

IDEA(2020版)实现Servlet的生命周期
IDEA(2020版)实现Servlet的生命周期

本篇文章在上一篇的基础上:IDEA(2020版)实现Servlet程序 源代码下载 (1) 百度网盘 通过网盘分享的文件:Servlet02.rar 链接: https://pan.baidu.com/s/1HJBp775kZzPdv75i6k6sNg?pwdvgje 提取码: vgje (2&#xff09… · 2026/9/27 9:21:54

win10 如何配置java jdk
win10 如何配置java jdk

开发java 项目配置java jdk是非常正常的一件事,这篇文章记录一下win10环境下如何配置java jdk。 1.下载jdk 官方地址:https://www.oracle.com/java/technologies/downloads/ 如果是windows版本,可以选择这三个下载。 本文选择下载的jdk8&… · 2026/9/27 9:21:54

IDEA(2020版)实现MyBatis入门程序
IDEA(2020版)实现MyBatis入门程序

可能遇到的报错: java.io.IOException: Could not find resource mybatis-config.xml IDEA 连接数据库报错Public Key Retrieval is not allowed 0.说明 工具:IDEA 2020.1 、Maven 3.6.3、jdk1.8 jdk1.8.0_131.zip链接: (1)百… · 2026/9/27 9:21:54

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码