收藏
回答

云数据查询语句中针对数组包含对象字段时多个条件有bug,不是或也不是与,类似是串联筛选,不是并联筛选

框架类型 问题类型 终端类型 AppID 环境ID 基础库版本
小程序 Bug 工具 wx3130ff62565d9763 msos-1gq4gv0da0381182 2.8.1

比如云数据库中有如上数据

那么db.collection('todos').where({
'_id': '一长串',
'data_details.id': '2''data_details.name': '婚姻测试'
}).get()
出来的数据应该是空,但是在云数据直接查询,是有数据的;
如果db.collection('todos').where({
'_id': '一长串',
'data_details.id': '2''data_details.name': '婚姻测试2222'
}).get() //出来数据是空
给我感觉,结果是第一步'_id': '一长串' todos拿来,第一个字段id有的,这条记录先拿来(这样算一条数据),
然后在看'data_details.id': '2',这条数据还是成立的,先留下这条数据
然后第三再看'data_details.name': '婚姻测试’,这条数据还是成立的,这条数据就要了。
错误的地方在于第二条和第三条应该是并列的,是针对一个数组里边的对象

----下面这个是在我的云数据库中执行的,isok=等待或者正在,或者成功都有数据,肯定跟我的逻辑不符 
db.collection('mycounty').where({
 
   '_id':'浙江省嘉兴市秀洲区',
m:({_id:'530745010620755500',
isok:'等待'
})
}).get()

最后一次编辑于  2021-08-22
回答关注问题邀请回答
收藏

1 个回答

  • 缪伟光(新塍)
    缪伟光(新塍)
    2021-09-16

    https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/database/query-array-object.html

    1. 更新数组中第一个匹配到的元素

    更新数组字段的时候可以用 字段路径.$ 的表示法来更新数组字段的第一个满足查询匹配条件的元素。注意使用这种更新时,查询条件必须包含该数组字段。

    ----

    所以说数据库就是这么设计的,也不算是bug,只能说是功能还不够完善,多个主键就有点难实现。

    如果不放在数组里边是没这个问题的的,但是不在数组里边的代价就是数据查询代价很大。

    比如销售订单,有几个状态,它的主键是订单号,但是这个订单是否完成,是否撤销这个状态也是很重要的,不能完成了还要再发一次货。实现方式有两个,第一更新前锁住,用数据库锁的方式;难度大了;第二种,更新发货的时候,就去价格条件就是这个订单号+是否完成,;

    还有一种方式,就是每个订单一条数据,这个也能用第二种来解决,但是订单一多,每次查20或者100条数据的限制,流量限制也是个大麻烦,所以设计数据结构的时候要想好

    ---

    第四种,更新主键,这个代价有点大,但是比如订单号是10位,加上后面1-2位,状态码,主键就是订单号加状态码--这个在发货订单等地方匹配的时候就要注意了,主键就是前面10户

    2021-09-16
    有用
    回复
登录 后发表内容