【问题标题】:What library do you use for postgres+jsonb in Node?您在 Node 中为 postgres+jsonb 使用什么库?
【发布时间】:2018-09-29 22:38:37
【问题描述】:

我想对包含对象数组的 jsonb/documents 进行更复杂的查询。有没有人会为 Node 推荐的库?我正在使用pg,但我想做更高级的查询,比如选择一个文档,其中一个文档有一个数组,其中一个对象具有某个键/值。如果没有任何库可以做到这一点,有谁知道我如何在 psql 中使用 json 函数/等来做到这一点?或者指向我可以学习这种高级查询的书籍/资源?

【问题讨论】:

  • 听起来和Massive.js一模一样。
  • 谢谢@vitaly-t 我会看看的!

标签: node.js postgresql jsonb


【解决方案1】:

如果你需要做真的复杂的事情,无论如何你都会编写 SQL。但是对于涉及使用 JSONB 字段Massive(完全公开,这是我的项目)的基本查询,您是否已经涵盖,并且执行手写准备好的语句与其他任何事情一样简单,因为脚本已加载到 API 中。

不幸的是,搜索嵌入式数组属于“非常复杂”的类别,但如果您知道元素位置,则可以使用 Massive 非常简单地完成此操作:

await db.mytable.find({
  'somejson.arrayfield[0].key': 'value'
});

这将返回来自mytable 的所有记录,其中somejson 列有一个arrayfield 数组,其中第一个元素包含一个"key": "value" 对。

如需搜索,请查看Postgres docs。您遇到的具体问题需要在 jsonb_array_elements 函数上进行横向连接,如下所示:

SELECT somejson
FROM mytable
JOIN LATERAL jsonb_array_elements(mytable.somejson->'arrayfield') AS elements
  ON TRUE
WHERE elements->>'key' = $1;

使用 Massive,您可以将此查询放在应用程序 /db 目录中的脚本中,并以 db.myScriptName('value') 运行它。您也可以使用文件夹对类似的脚本进行分组。

【讨论】:

  • 谢谢,我尝试了大量但最终只使用 node-postgres 并编写 sql 哈哈。 jsonb_array_elements 现在是我的生计:P
  • @Martin8768 fwiw 最近我一直在挖掘文档代码,发现 Massive 实际上可以匹配带有db.docs.findDoc({array: [{key: 'value'}]}); 的对象数组。前段时间我在修改文档时一定是漏掉了!
  • 酷!很高兴知道当我有时间我会再看一遍,我喜欢通过手写查询来学习很多关于 postgres 的知识,因为这是一个我可以承担“手工制作”查询的个人项目:P 哈哈
猜你喜欢
  • 2015-05-03
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多