收藏
回答

使用位置操作符$失效

框架类型 问题类型 终端类型 AppID 环境ID 基础库版本
小程序 Bug 工具 wx49176ee3329f0ed7 agri-store-001-1gklhtbl6c41f198 3.4.2

我的云函数代码如下:

// 返回输入参数
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的第一个元素进行修改,为什么会这样?怎么解决?

回答关注问题邀请回答
收藏

1 个回答

  • ETHEREAL
    ETHEREAL
    04-26

    大概猜到原因了,我猜是这样子的:

    使用这个条件

    {'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


    04-26
    有用
    回复
登录 后发表内容
问题标签