收藏
回答

云开发中如何根据集合中记录的_id及所包含的对象数组的id更新对象数组中的某一字段值?

集合数据结构如下图:

业务需求:修改items中某一个对象的enable属性的值,如:enbale=false,

借鉴交流专区其他提问的答案,执行显示成功,但是数据并没有更新。请问如何修改?

js代码如下:

//修改检查项的可用状态
  changeEnable(e) {
    //获取前端传值standard_id, item_id
    let _standard_id = e.currentTarget.dataset.standard_id
    let _item_id = e.currentTarget.dataset.item.id
    let _enable = e.currentTarget.dataset.item.enable
    let _index = e.currentTarget.dataset.index
    console.log(_index, _standard_id, _item_id, _enable)//能够正常获取到值

    wx.cloud.database()
      .collection('hl_standard')
      .where({
        '_id': _standard_id,
        'id': _item_id
      })
      .update({
        data: {
          'items.$.enable': !_enable
        }
      })
      .then(res => {
        console.log(res)
      }).catch(err => {
        console.log(err)
      })
  }
  
回答关注问题邀请回答
收藏

2 个回答

  •  存储
     存储
    2023-03-24

    终于找到了正确有效的方法,贴出来分享。

    1、云函数(自定义名称:updateStandardItem)
    // 云函数入口文件
    const cloud = require('wx-server-sdk')
    cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境
    // 云函数入口函数
    exports.main = async (event, context) => {
      return await cloud.database()
        .collection('hl_standard')
        .doc(event._id)
        .update({
          data: {
            [`items.${event.index}.enable`]: event.enable,
            [`items.${event.index}.type`]: event.type,
            [`items.${event.index}.title`]: event.title,
            [`items.${event.index}.number`]: event.number,
          }
        }).then(res => {
          return res
        })
        .catch(err => {
          return err
        })
    }
    //构造data是核心!小程序端需要传集合名称(如:hl_standard)、要修改的数组中的对象的索引(不需要关注对象的唯一ID,本例中是“id”,我这里索引是个变量“index”),然后就是要修改的字段的值。
    

    2、小程序端

    //修改检查项的可用状态
      changeEnable(e) {
        //获取前端传值standard_id, item_id
        let _standard_id = e.currentTarget.dataset.standard_id
        let _enable = e.currentTarget.dataset.item.enable
        let _index = e.currentTarget.dataset.index
    
        wx.cloud.callFunction({
          name: 'updateStandardItem',
          data: {
            _id: _standard_id,
            index: _index,
            enable: !_enable,
          }
        })
          .then(res => {
            console.log(res)
          }).catch(err => {
            console.log(err)
          })
      }
    
    2023-03-24
    有用 1
    回复
  • 跨商通
    跨商通
    2023-03-23

    测试方法:先用.get,获取的数据准确后,再换成.update。

    wx.cloud.database()
          .collection('hl_standard')
          .where({
            '_id': _standard_id,
            'items.id': _item_id//此处要写对象路径。
          })
          .update({
            data: {
              'items.$.enable': !_enable
            }
          })
    
    
    2023-03-23
    有用
    回复
登录 后发表内容