使用小程序云开发API更新数组中的单个数组元素
看了看mongoDB的更新数据方式,找到了解决办法,解决方法如下,亲测可用:
第一种方法:使用位置操作符$
-
代码,条件更新写在云函数中
-
test_api集合原始数据如下
-
在云函数中执行1中的代码,数组users中id为1001的用户添加了一个新的属性test
-
原理分析
where条件是查找数组中id属性为1001的用户
update中的使用’users.$.test’: ‘test’
注意里面的$符号,在mongoDB中,这个符号叫做位置操作符,代表数组的下标,如下引自《mongoDB实战》
第二种方法:直接使用数组下标
- 云函数代码
- test_api集合原始数据如下
- 代码执行后
相对于第一种方法,这种方法更加简单,只不过users.1.test这种写法有点颠覆js和java中的属性书写规则,让人感觉怪怪的,在mongoDB中,也支持点数字这种写法。
- 一个可能的疑惑
可不可以写作’users[1].test’:‘test’,测试结果如下:
可以看到’user[1]'无法被识别为数组的第二个元素,而是作为了属性名新增了一个属性,结论:必须写成”点数字“不能写成“中括号”
结论:
经过测试,使用这两种种方法可以更新数组中的一个元素。
方法一适合在不知道数组元素下标的情况下根据查询条件更新元素;
方法二适合在知道数组元素下标的情况下更新元素;
当然也存在既知道元素下标也可以通过属性查到的情况,想用哪个就看心情了-.-
但是暂未找到查询返回数组中的一个元素的方法,再探索探索吧 ——。——
温故知新一下。
首先官方文档里提到了这个用法,写在了指南里,没写在API里。
https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/database/query-array-object.html
另外,今天再次用$,发现可能有bug,卡住了,很绝望。如果另外存在一个查询条件也是数组型字段,$只会匹配到位置0,永远更新第一个元素。
老铁,我进一步咨询个问题,按照你这个例子,我想把id:1002的删除掉,这个应该怎么写?
请问,是不是只能更改,而没法GET到这个数组。
这里加个补充:
通过一个条件匹配数组下标使用 $
通过多个条件匹配数组下标使用 $elemMatch
To specify criteria on multiple fields of documents inside that array, use the
$elemMatch
query operator. The following query returns the first document inside agrades
array that has amean
of greater than 70 and agrade
of greater than 90.https://docs.mongodb.com/manual/reference/operator/projection/positional/index.html#array-field-limitations
那位高手能帮帮忙,试了半天没成功,能查到要用的元素,但更改不成功
我的数据结构如下:
比如说我要更改AB数组,第一个元素a的对应值,要怎么在改呀!?
更新AB整个第一个元素也行,
{ "A":"123", "B":"名字", "AB":[ {"a":"1","b":"1","c":"3"}, {"d":"4","e":"5","f":"6"}, ...... {"x":"n","x":"n","z":"n"}, ], }
真棒
感谢楼主
可以可以,文档里好像没说第一种方法,也正是我需要的
谢谢,老铁,解决了我大问题
谢谢楼主.
有个问题,users.1.test 里面的数字下标可以用变量吗,我试了
'users.n.test': 'test' n是个整型变量,可程序不起作用.
这个字符串如果要拼接的话,应该用'user.'+n+'.test'吧,或者用ES6模版字符串`user.${n}.test`才行吧,`指的是波浪线,也就是Tabl键上面那个,你可以试一下