评论

# 使用小程序云开发API更新数组中的单个数组元素

使用小程序API更新数组中的单个元素

使用小程序云开发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]'无法被识别为数组的第二个元素,而是作为了属性名新增了一个属性,结论:必须写成”点数字“不能写成“中括号”

结论:

经过测试,使用这两种种方法可以更新数组中的一个元素。
方法一适合在不知道数组元素下标的情况下根据查询条件更新元素;
方法二适合在知道数组元素下标的情况下更新元素;
当然也存在既知道元素下标也可以通过属性查到的情况,想用哪个就看心情了-.-
但是暂未找到查询返回数组中的一个元素的方法,再探索探索吧 ——。——

最后一次编辑于  2019-03-06  
点赞 21
收藏
评论

12 个评论

  • 郑旭东
    郑旭东
    2020-04-21

    温故知新一下。

    首先官方文档里提到了这个用法,写在了指南里,没写在API里。

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

    另外,今天再次用$,发现可能有bug,卡住了,很绝望。如果另外存在一个查询条件也是数组型字段,$只会匹配到位置0,永远更新第一个元素。

    2020-04-21
    赞同 2
    回复 3
  • 琳
    2019-09-11

    老铁,我进一步咨询个问题,按照你这个例子,我想把id:1002的删除掉,这个应该怎么写?

    2019-09-11
    赞同 2
    回复
  • 米艳明
    米艳明
    2020-11-23

    请问,是不是只能更改,而没法GET到这个数组。

    2020-11-23
    赞同 1
    回复
  • 顾 孝天
    顾 孝天
    2020-05-06

    这里加个补充:

    通过一个条件匹配数组下标使用 $

    通过多个条件匹配数组下标使用 $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 a grades array that has a mean of greater than 70 and a grade of greater than 90.

    https://docs.mongodb.com/manual/reference/operator/projection/positional/index.html#array-field-limitations

    2020-05-06
    赞同 1
    回复
  • 中山狼
    中山狼
    2020-12-12

    那位高手能帮帮忙,试了半天没成功,能查到要用的元素,但更改不成功

    我的数据结构如下:


    比如说我要更改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"},
    ],
    }
    
    
    
    2020-12-12
    赞同
    回复
  • 马鞍山外头
    马鞍山外头
    2020-08-17

    真棒

    2020-08-17
    赞同
    回复
  • 于剑秋
    于剑秋
    2020-07-07

    感谢楼主

    2020-07-07
    赞同
    回复
  • 郑旭东
    郑旭东
    2020-01-20

    可以可以,文档里好像没说第一种方法,也正是我需要的

    2020-01-20
    赞同
    回复
  • 归寂
    归寂
    2019-07-29

    谢谢,老铁,解决了我大问题

    2019-07-29
    赞同
    回复
  • 2019-05-23

    谢谢楼主.

    有个问题,users.1.test 里面的数字下标可以用变量吗,我试了

    'users.n.test': 'test' n是个整型变量,可程序不起作用.


    2019-05-23
    赞同
    回复 7
    • H
      H
      2019-05-28

      这个字符串如果要拼接的话,应该用'user.'+n+'.test'吧,或者用ES6模版字符串`user.${n}.test`才行吧,`指的是波浪线,也就是Tabl键上面那个,你可以试一下

      2019-05-28
      回复
    • 徐大治
      徐大治
      2019-08-03回复H
      尝试了,不可以。还是不知道如何传递数组下标参数对数组进行更新。
      2019-08-03
      回复
    • H
      H
      2019-08-05回复徐大治
      会不会是因为在客户端使用了where条件更新方式导致更新不成功呢,如果是这个问题,可以使用云函数试一下;如果不是这个问题,可以贴一下你的代码,大家一起分析下
      2019-08-05
      回复
    • 徐大治
      徐大治
      2019-08-05回复H
      问题解决了,使用方括号,像这样-> a: { [b]:{c,d}}
      2019-08-05
      回复
    • 我是玖柒后
      我是玖柒后
      2019-08-16
      拼接之后用 [] 把动态的变量包裹起来就可以了
      2019-08-16
      回复
    查看更多(2)

正在加载...

登录 后发表内容