集合数据结构如下图:
业务需求:修改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)
})
}
终于找到了正确有效的方法,贴出来分享。
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) }) }
测试方法:先用.get,获取的数据准确后,再换成.update。
wx.cloud.database() .collection('hl_standard') .where({ '_id': _standard_id, 'items.id': _item_id//此处要写对象路径。 }) .update({ data: { 'items.$.enable': !_enable } })