比如云数据库中有如上数据
那么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()
https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/database/query-array-object.html
1. 更新数组中第一个匹配到的元素
更新数组字段的时候可以用
字段路径.$
的表示法来更新数组字段的第一个满足查询匹配条件的元素。注意使用这种更新时,查询条件必须包含该数组字段。----
所以说数据库就是这么设计的,也不算是bug,只能说是功能还不够完善,多个主键就有点难实现。
如果不放在数组里边是没这个问题的的,但是不在数组里边的代价就是数据查询代价很大。
比如销售订单,有几个状态,它的主键是订单号,但是这个订单是否完成,是否撤销这个状态也是很重要的,不能完成了还要再发一次货。实现方式有两个,第一更新前锁住,用数据库锁的方式;难度大了;第二种,更新发货的时候,就去价格条件就是这个订单号+是否完成,;
还有一种方式,就是每个订单一条数据,这个也能用第二种来解决,但是订单一多,每次查20或者100条数据的限制,流量限制也是个大麻烦,所以设计数据结构的时候要想好
---
第四种,更新主键,这个代价有点大,但是比如订单号是10位,加上后面1-2位,状态码,主键就是订单号加状态码--这个在发货订单等地方匹配的时候就要注意了,主键就是前面10户