我在redis中找到了关于Group By的question,但实际上并没有解决我的问题。我有一个复杂的产品搜索,一旦我得到了我想要的产品,我想把它们分到商店,因为它们必须在地图上展示。
我的实际实施如下:
- 按模式搜索产品的功能,它将产品ID返回为“product:id”
product_ids = search_products_by_indexing(pattern)
- 名称为“sold”的哈希,其中包含product:id / shop:id作为键/值。
shops = $redis.hmget("selling", *product_ids)
# this returns list of shops as "shop:id" which sell the given prodcuts
- 然后我将商店与另一个商店交叉,以便只获得位于特定城市的商店。
result_shops = shops & $redis.smembers("shops:city_name")
# OR by redis
$zinterstore(tem_id, shops, $redis.smembers("shops:city_name"))
result_shops = $redis.zrange(temp_id, 0, -1)
- 我唯一需要的是将搜索到的产品按result_shops分组。或者例如,这可以是商店的哈希:id / [product:id]作为键/值(这是最终结果,商店必须在城市,产品与模式匹配)
我的解决方案是否适合此问题,或者可能有更好的实施方案来解决它?任何建议都将非常感谢!!
更新:一个产品只属于一个商店,一个商店可以有多个产品。
答案 0 :(得分:1)
- 名称为“sold”的哈希,其中包含product:id / shop:id as key / value。
这种哈希的使用只允许你shop:id
每product:id
个shop:id
,这意味着只有一家商店可以销售给定的产品...也许该值应该是{{1}的连续列表或者甚至更好 - 使用Set selling:product:id
并将所有相关的shop:id
存储在其中。
- 然后我将商店与另一个商店交叉,以便只获得位于特定城市的商店。
IMO这是多余的,因为相交的结果总是shops:city_name
- 我唯一需要的是将搜索到的产品按result_shops分组。
如果您已经使用我的Set而不是Hash建议,可以通过以下方式完成:
ZINTERSTORE tem_id 2 shops:city_name selling:product:id
ZRANGE tem_id 0 -1