在 PostgreSQL 中对 JsonB 数组进行 Sequelize ORM 查询

2024-01-16

如何使用一些匹配条件和逻辑运算(lt, et, gte等)在 Jsonb 对象数组上([{...}, {...}])在 PostgreSQL 中使用 Sequelize ORM。

表名: calls

id direction metaData
1 inbound [{...}, {...}]
2 outbound [{...}, {...}]

元数据:

[{
    "id": 1,
    "audioUrl": "https://xyz.wav",
    "duration": 136,
    "agentName": "Ext 204",
    "calledNumber": "123456789",
    "callingNumber": "987654321",
    "startedAt": "2020-08-31 5:07:00",
    "endedAt": "2020-08-31 11:07:20",
},
{
    "id": 2,
    "audioUrl": "https://abc.wav",
    "duration": 140,
    "agentName": "Ext 210",
    "calledNumber": "123456789",
    "callingNumber": "987654321",
    "startedAt": "2020-08-31 10:07:00",
    "endedAt": "2020-08-31 10:09:20",
}]

我想使用 Sequelize ORM 根据元数据条件从表中搜索数据。

示例1:获取所有行,其中agentName ='Ext 204'并且持续时间> = 136

示例2:获取所有agentName='Ext 204'并且startedAt>='2020-08-31 10:07:00'的行

我的模型查询:

const Op = Sequelize.Op;
const resp = await callModel.findAll({
      attributes: ['id', 'direction'], // table columns
      where: {
            metaData: { // jsonB column
                [Op.contains]: [
                    {agentName: 'Ext 204'},
                ],
            },
        },
    });

上述模型搜索调用执行以下查询:

SELECT "id", "direction" FROM "calls" AS "calls" WHERE "calls"."metaData" @> '[{"agentName":"Ext 205"}]';

我的尝试:哪个不起作用

callModel.findAll({
        attributes: ['id', 'direction'], // table columns
        where: {
            metaData: { // metaData
                [Op.and]: [
                    {
                        [Op.contains]: [
                            {agentName: 'Ext 204'},
                        ],
                    },
                    {
                        duration: {
                            [Op.lt]: 140
                        }
                    }
                ]
            },
        },
    });

查询结果:

SELECT "id", "direction" FROM "calls" AS "calls" WHERE ("calls"."metaData" @> '[{"agentName":"Ext 205"}]' AND CAST(("calls"."metaData"#>>'{duration}') AS DOUBLE PRECISION) < 140);

必需的:无法添加更多条件持续时间


由于您正在查询 JSONB 字段,因此常规逻辑运算将不起作用。

例如,您使用了Op.contains在你的例子中,它的组成是"calls"."metaData" @> ... which @>是 JSON 字段的特殊运算符。

您可以在此处找到更多 JSON 运算符:https://www.postgresql.org/docs/12/functions-json.html https://www.postgresql.org/docs/12/functions-json.html

对于大于操作,您可以使用@@运算符检查数组中的元素。据我所知,Sequelize 不支持这个@@操作,我用literal SQL.

where: {
  [Op.and]: [
    {
      metaData: {
        [Op.contains]: [
          {agentName: 'Ext 204'},
        ],
      }
    },
    Sequelize.literal(`"calls"."metaData" @@ '$[*].duration >= 136'`)
  ]
}

这将返回整个记录(包括元数据中的所有元素),如果any内的元素metaData符合条件。

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

在 PostgreSQL 中对 JsonB 数组进行 Sequelize ORM 查询 的相关文章

随机推荐

  • 如何将 BufferedImage 保存为文件

    我正在使用imgscalr http www thebuzzmedia com software imgscalr java image scaling library用于调整图像大小的 Java 库 resize 方法调用的结果是 Buf
  • 将带有日期的字符串解析为日期时间对象[重复]

    这个问题在这里已经有答案了 如何将 01 Jan 1995 这样的字符串解析为Pythondatetime object 总的来说 您可以使用以下命令解析日期和时间字符串strptime功能于time or datetime模块 您的示例可
  • 如何在cocoa中模拟mac媒体键

    我需要模拟按下 mac 键盘上的媒体 功能键 从亮度到音量增大 减小的一切 这可能吗 如果是这样怎么办 我读过很多关于如何触发他们的新闻的文章 但不是这个 如果可能的话 我希望当您更改内容时 半透明的图标仍然出现在屏幕上 在 Swift 中
  • Visual C++:如何禁用特定链接器警告?

    我正在使用 CGAL 中的一个库 该库在代码编译的链接阶段会产生许多这种形式的链接警告 warning LNK4099 PDB vc80 pdb was not found with gmp vc80 mt sgd lib or at vc
  • 在android中放大图像视图时如何禁用抗锯齿?

    我有一幅像素艺术 我想放大它 问题是当我放大它时 它会因为抗锯齿而变得模糊 有没有办法直接从 xml 禁用抗锯齿功能 我希望它有用 Bitmap bmpSource BitmapFactory decodeResource getResou
  • 在 Android Studio 中运行应用程序时如何切换自动打开运行选项卡?

    有没有办法让 Android Studio 在运行应用程序时自动打开运行选项卡 解决办法是去Run gt Edit Configurations gt 选择 杂项 选项卡并检查Show logcat automatically
  • Subversion Server SSL 证书验证失败:以及其他原因

    我有一个 SVN 系统 运行得很好 但在最近升级后突然停止工作 我的设置 我有一个使用 VisualSVN Server 2 7 4 托管在 Windows 2008 服务器上的存储库 服务器使我能够随意生成自签名证书 根据需要输入我自己的
  • 从一个节点 A 到节点 B 的最大边权

    给定一个连通的无向图N节点 1 NN 1边缘 我们定义一个函数F a b where F a b 等于路径中的最大边权重a to b 我们如何找到总和F a b 对全部a b这样1 lt a b lt N 模 10 9 7 示例图 F a
  • SQL Server 2008 (R2) 的 CRUD SP 生成器

    我正在使用 SQL Server 2008 R2 是否有一个免费的脚本 实用程序可以为我的所有数据库表创建 CRUD SP 我以前有一份 但剧本丢了 Thanks I use SSMS 工具包 http www ssmstoolspack
  • C# 在运行时获取进程输出

    无论如何 是否可以重定向生成进程的标准输出并在发生时捕获它 我所看到的一切都只是在该过程完成后执行 ReadToEnd 我希望能够在打印时获得输出 Edit private void ConvertToMPEG Start the chil
  • Android 内存不足异常

    有什么办法可以处理吗OutOfMemoryException在Android中同时使用大量图片的Bitmap 我尝试了本网站给出的所有解决方案 即 GC Bitmap reset 我只是想知道在堆内存即将满之前是否可以生成警报 这样我就可以
  • ABAP ADT 先决条件?

    在 Eclipse 中建立与本地数据库的连接以开始在 ABAP 中进行开发需要什么 我已经安装了 ABAP 插件 但无法连接到数据库 有什么建议么 ABAP 开发工具 ADT https tools hana ondemand com ab
  • 从 Ada 程序启动可执行文件并读取结果

    I found this https stackoverflow com questions 32663224 why isnt my gnats standout file descriptor working问题和第一个答案包含一些示例
  • 在jqgrid中添加行

    我正在使用 jqGrid 并且它工作正常 我有一个场景 我必须在 jqGrid 中添加一个空白行 而不是弹出窗口来添加行 我该怎么做 您可以使用例如添加行数据 http www trirand com jqgridwiki doku php
  • 用C将客户端输入插入MySQL数据库

    如何编写一个 C 程序来获取 MySQL 服务器的客户端输入 我使用 Fedora 作为我的操作系统 这是我的代码 include
  • 如何判断 ASP.NET 应用程序中的 HTTP 标头何时已发送?

    长话短说 我有一个 ASP NET 应用程序 我正在尝试调试 在某些时候 在非常特殊的情况下 该应用程序将抛出异 常Response Redirect 陈述 Cannot redirect after HTTP headers have b
  • 如何使用 Linq 选择具有一对多关系的所有内容

    我有两张桌子 CREATE TABLE Thing Id int Name nvarchar max CREATE TABLE SubThing Id int Name nvarchar max ThingId int foreign ke
  • Google 地图未完全呈现在页面上?

    我的页面上有一个谷歌地图 其中有一个我自己构建的搜索窗格 可以随意显示和隐藏 假设它的一侧覆盖了地图的 200 个像素 问题是 当我调整地图大小时 窗格重叠的区域不会渲染 即地图由于某种原因不会在那里渲染 看看这个link http www
  • 如何将 .XLS 和 .XLSX 文件转换为 .PDF 格式并将它们返回到 Powershell 中的每个原始子文件夹?

    我目前有一个 powershell 脚本 可以很好地将 Excel 电子表格转换为 PDF 文件 但我的问题是新文件出现在父文件夹中 而不是它们来自的特定子文件夹中 我当前的脚本如下所示 path c users me Documents
  • 在 PostgreSQL 中对 JsonB 数组进行 Sequelize ORM 查询

    如何使用一些匹配条件和逻辑运算 lt et gte等 在 Jsonb 对象数组上 在 PostgreSQL 中使用 Sequelize ORM 表名 calls id direction metaData 1 inbound 2 outbo