uni-app 支付宝云查询数据库时where不支持冒号筛选数组数据中是否存在某数据

uni-app 支付宝云查询数据库时where不支持冒号筛选数组数据中是否存在某数据

操作步骤:

在支付宝小程序云中查询数据库时使用where操作符查询bool类型的数据时传入{ xxx: "true" }{ xxx: "false" }; 在支付宝小程序云中查询数据库时使用where操作符查询array类型的数据时使用dbCmd.all(['xxx'])的方式筛选数组中存在xxx数据的条目

预期结果:

能够正常查询到数据

实际结果:

支付宝云中查询不到,同样的操作阿里云中能查询到

bug描述:

问题是在uni-upgrade-center中发现的,以前用阿里云是正常的,换支付宝云后就完全用不了了(包括uni-admin中的App升级中心模块),反复重装、调试、折腾了很久后发现了支付宝云在数据库查询中的一些不同点。

  1. 首先是bool类型的值在where查询时不能直接使用true和false,要以字符串形式传入才能正常筛选bool类型的数据,如第一、第二张图演示(均为支付宝云)。
  2. 其次是where操作符中不能直接使用":"冒号的方式来筛选数组数据中是否存在某个数据,如第三张图中platform是数组类型,如果直接用{ platform: 'Android' }就查询不到,除非用dbCmd.all(['Android']),而在阿里云中则是正常的,如第四张图。

Image Image Image Image


更多关于uni-app 支付宝云查询数据库时where不支持冒号筛选数组数据中是否存在某数据的实战教程也可以访问 https://www.itying.com/category-93-b0.html

9 回复

支付宝云有个特殊的规则: 数组字段查询必须添加 array 类型的索引才可以正常查询,注意: 必须加索引,且必须是array类型的索引

更多关于uni-app 支付宝云查询数据库时where不支持冒号筛选数组数据中是否存在某数据的实战教程也可以访问 https://www.itying.com/category-93-b0.html


试了一下,数据表scheme中platform的类型为array,修改索引配置文件中platform为array类型后无法上传索引配置文件了,报错“Business Failed, 索引名称已存在. traceId: 21d6639c17435909948894957e6bd8”,但是实际上根本没有配置索引,移除"Type": "array"后正常。 配置为: [ { “IndexName”: “appid”, “MgoKeySchema”: { “MgoIndexKeys”: [ { “Name”: “appid”, “Direction”: “1” }, { “Name”: “uni_platform”, “Direction”: “1” }, { “Name”: “create_env”, “Direction”: “1” } ], “MgoIsUnique”: false } }, { “IndexName”: “查找上线发行应用”, “MgoKeySchema”: { “MgoIndexKeys”: [ { “Name”: “appid”, “Direction”: “1” }, { “Name”: “platform”, “Direction”: “1”, “Type”: “array” }, { “Name”: “stable_publish”, “Direction”: “1” }, { “Name”: “uni_platform”, “Direction”: “1” }, { “Name”: “create_env”, “Direction”: “1” } ], “MgoIsUnique”: false } } ]

回复 6***@qq.com: 直接去控制台添加array类型的索引

回复 DCloud_uniCloud_VK: 这个问题解决了,非常感谢!还有另一个查询时筛选bool类型的数据要传字符串形式的true和false的问题,这个是bug吗

回复 6***@qq.com: 不是bug, 需要添加 bool类型的索引

像下面这样添加索引后stable_publish还是和以前一样只能用字符串形式的bool值筛选(platform是正常的了) @DCloud_uniCloud_VK

云端和本地都修改了,也都试过了

回复 6***@qq.com: 这里涉及到支付宝云另外一个bug,就是索引删除后再创建(非array类型索引)不会生效的问题,你可能需要删除表重新建立索引

这是支付宝云数据库与阿里云数据库在查询语法上的差异问题。针对你描述的两个问题:

  1. 布尔值查询问题: 支付宝云确实需要将布尔值转为字符串形式查询,这是支付宝云的特殊要求。建议统一使用字符串形式'true'/'false'进行查询以保证兼容性。

  2. 数组查询问题: 支付宝云对数组查询的语法更严格,必须使用dbCmd.all()方法,而阿里云支持更宽松的冒号语法。这是两个云服务在实现上的差异。

解决方案:

  1. 对于布尔查询,统一使用字符串形式
  2. 对于数组查询,使用标准查询命令:
where({
  platform: dbCmd.all(['Android'])
})
回到顶部