【问题标题】:Search Postgres JSON type using greater than/less than使用大于/小于搜索 Postgres JSON 类型
【发布时间】:2015-06-10 07:49:52
【问题描述】:

我使用 Rails 4 将哈希存储在 JSON 数据类型中,需要在哈希中搜索满足 <> 条件的值。

例如,使用像 {location: {"lat": -112, "lng": 33}} 这样的哈希,我需要能够找到经纬度的范围。

类似:

Place.where("location ->> "lng" < -111 && > -113)

虽然 Postgres 9.3 似乎不支持这一点,但有没有一种方法可以在不使用类似的情况下解决这个问题:

Place.all.select { |place| place.location["lng"] < -111 && > -113 }

【问题讨论】:

  • places 表中的属性是什么?
  • 存储在 JSON 中的唯一属性是位置,因为它是纬度和经度
  • 你在地方表上发起查询..如何?
  • Place.where("location -&gt;&gt; 'lng' &lt; ?", -111) 我刚刚意识到这是错误的,因为您必须根据文本进行搜索,对吗?所以我相信“-111”让它工作......
  • 您试图将 111 和 113 与哪一列进行比较?地点是属于:位置吗?

标签: ruby-on-rails json postgresql


【解决方案1】:

我之前查询这个的方法是Place.where("location -&gt;&gt; 'lng' &lt; ?", -111),这有点不正确

出于某种原因,您必须通过文本搜索(我相信有人可以在 cmets 中回答为什么会这样),因此将查询稍微更改为 Place.where("location -&gt;&gt; 'lng' &lt; ?", "-111") 似乎可行!

【讨论】:

  • 您的新查询有效,因为 ->> 运算符返回 text 类型的数据。您想要做的是将其转换为带有::int 的整数。我假设以下查询会起作用:Place.where("(location-&gt;&gt;'lng')::int &lt; ?", -111)
  • 啊,有道理。当我有机会做这件事时,我今晚会试试看!非常感谢米格尔!
  • 如果你的 postgres 版本 >= 9.3 那么你也可以使用:Place.where("(location -&gt;&gt; 'lng')::numeric &lt; ?", -111)。如果您的值具有浮点类型,这将很有用。
猜你喜欢
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多