Supabase中基于嵌套jsonb字段匹配手机号查询联系人问题
问题:Supabase中根据JSONB嵌套字段的手机号查询联系人失败
我在Supabase中有一个Contacts表,其中包含一个jsonb类型的basics列,该列的JSON结构如下:
{ "id": "f760017a-7adb-437c-8b5c-4e1f914a0339", "avatar": "", "status": "active", "company": "", "channels": { "239455a5-9d0b-48d7-8ef2-8310fdcc5e73": { "id": "239455a5-9d0b-48d7-8ef2-8310fdcc5e73", "label": "Instagram", "value": "", "channelKey": "social", "channelType": "Social", "isMessageChannel": false }, "abbde327-d5bd-4428-b980-0311ae574d91": { "id": "abbde327-d5bd-4428-b980-0311ae574d91", "label": "Personal", "value": "", "channelKey": "email", "channelType": "Email", "isMessageChannel": false }, "cb783d57-d9b3-4e9f-a708-3f115a154f23": { "id": "cb783d57-d9b3-4e9f-a708-3f115a154f23", "label": "Mobile", "value": "3335557777", "channelKey": "sms", "channelType": "Phone", "isMessageChannel": true } }, "lastName": "Roberts", "addresses": {}, "firstName": "Freddie" }
我需要根据联系人的手机号查找对应的联系人,尝试了以下代码但执行失败:
const { data: contacts, error: _err } = await supabaseClient .from('contacts') .select('*') .contains('basics->channels->value', '3335557777')
请问如何解决这个嵌套值匹配的问题?
解决方案
你的代码执行失败是因为basics->channels是以UUID为键的对象集合,并非直接包含value字段的结构,contains无法定位到动态键下的嵌套value字段。可以通过PostgreSQL的JSON路径查询实现需求,Supabase原生支持该方式,具体代码如下:
const { data: contacts, error } = await supabaseClient .from('contacts') .select('*') .filter('basics', 'jsonb_path_exists', '$.channels.*.value == "3335557777"')
代码说明:
jsonb_path_exists是PostgreSQL的JSONB函数,用于检查JSON路径是否存在匹配值$.channels.*.value是JSON路径表达式:$代表根节点(即basics列的JSON对象)channels.*表示遍历channels对象下的所有子节点(忽略键名).value表示匹配子节点中的value字段,判断其是否等于目标手机号"3335557777"
如果需要模糊匹配手机号,可调整路径表达式:
// 模糊匹配以333开头的手机号 .filter('basics', 'jsonb_path_exists', '$.channels.*.value like_regex "333.*"')
内容的提问来源于stack exchange,提问作者JarvisWorks
相关产品推荐
相关产品推荐

