我的云函数代码如下:
// 返回输入参数
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的第一个元素进行修改,为什么会这样?怎么解决?
大概猜到原因了,我猜是这样子的:
使用这个条件
{'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