大概猜到原因了,我猜是这样子的: 使用这个条件 {'children.pid': params.pId, 'children.id': params.cId} 的时候,系统即会匹配传入的pid,也会匹配传入的id,也就是或的关系,然后这个是个父子级的文件夹数据,所以所有子项的pid都是一样的都等于3,所以可以搜索到很多pid是3的数据,然后这个where搜索的时候,位置操作符只会定位到匹配的第一个数据,所以每次不管id改成啥,只要pid没有变,他都会定位到pid所匹配的第一个元素,children里面所有元素的pid都是3,所以他直接匹配到children里面的第一个元素了。我的解决办法是把'children.pid': params.pId去掉,就留了1个cid,这样的话她就会直接匹配到那个具体的id而忽略掉pid
使用位置操作符$失效我的云函数代码如下: // 返回输入参数 const cloudbase = require('@cloudbase/node-sdk'); const app = cloudbase.init({ env: cloudbase.SYMBOL_CURRENT_ENV, }); const db = app.database(); const collection = db.collection('menuList') const _ = db.command; const $ = _.aggregate; exports.main = async (event, context) => { return new Promise((resolve, reject) => { funcList[event.func](event.params) .then((res) => { resolve(res); }) .catch((err) => { reject(err); }); }); }; const funcList = { saveMenuById: (params) =>{ return collection.where( _.and({'children.pid': params.pId, 'children.id': params.cId}) ) // .get() .update({ data:{ 'children.$.name': params.data.name } }) } }; 入参如下: { "func": "saveMenuById", "params": { "cId": 5, "pId": 3, "data": { "name": "我改了名字哦" } } } 运行这段代码后,数据库变成了这样。 [图片] 如果我把代码改成这样↓: const funcList = { saveMenuById: (params) =>{ return collection.where( _.and({'children.pid': params.pId, 'children.id': params.cId}) ) // .get() //.update({ // data:{ // 'children.$.name': params.data.name // } // }) ==================改了下方位置↓↓============= .update({ 'children.$.name': params.data.name; }) } }; 则结果就会变成这样: [图片] 而且,此时,不管我把cid匹配到4还是7还是18,这段语句永远都只对children的第一个元素进行修改,为什么会这样?怎么解决?
2024-04-26