小编Geo*_*way的帖子

在Clojure中有条件地初始化地图元素

我正在寻找有条件避免在初始化/定义时向地图添加元素的最佳方法.在这种情况下,如果键的值为nil,我想避免向地图添加元素.

(defn create-record [data]
  (let [res {
    :username (data :username)
    :first-name (get-in data [:user-info :name :first])
    :last-name (get-in data [:user-info :name :last])
    :gender (get-in data [:user-info :sex])
   }])
)
Run Code Online (Sandbox Code Playgroud)

如果get-in的结果为nil(数据中的性别字段不存在),我不想在地图上添加性别.有没有办法在我创建地图时这样做?在创建地图后,我可以删除其值为nil的所有键,但在某些情况下,如果它们具有nil值,我希望某些键具有nil值而其他键根本不在地图中.

clojure

25
推荐指数
1
解决办法
4408
查看次数

使用 Postgres 中的嵌套数组高效查询 JSON

我正在尝试在 Postgres(Amazon RDS 上的 9.6)中查询 JSON 数据结构。数据包含一个对象数组,而对象数组又包含一个包含对象数组的元素。我想在这些嵌套数组之一中找到与键 + 值匹配的所有记录。

给定这样的行:

{"drinkers" : [
  {"name" : "geoff", 
   "beers" : [
     {"name": "PBR"},
     {"name" : "Bud Select"}
    ]}, 
  {"name" : "tom", 
   "beers" : [
     {"name": "Bud Light"},
     {"name" : "Busch"}
    ]}
]}
Run Code Online (Sandbox Code Playgroud)

我想找到名称为“PBR”的drinkers.beers 对象的所有行。我最接近的是这个:

select jsonb_data 
from bars 
where jsonb_array_elements(jsonb_array_elements(data -> 'drinkers') -> 'beers') ->> 'name' = 'PBR'``
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为 where 返回一个列表而不是单个真/假来匹配。我已经使用子查询、横向连接等提出了其他解决方案,但所有这些解决方案都存在性能问题,即使使用适当的 gin 索引也是如此。关于如何在 Postgres 中查询这样的数据结构有什么建议吗?

postgresql json

3
推荐指数
1
解决办法
4096
查看次数

标签 统计

clojure ×1

json ×1

postgresql ×1