使用HTTP API更新小程序云数据库数组中第N项数据(HTTP中pull无效)

微信开发文档中对小程序云数据库更新的API指令描述如下(使用HTTP时不能使用pull和pullAll)

更新指令

Command (db.command) 对象上有如下更新指令:

数组 push 往数组尾部增加指定值
  pop 从数组尾部删除一个元素
  shift 从数组头部删除一个元素
  unshift 往数组头部增加指定值
  addToSet 原子操作,如果不存在给定元素则添加元素
  pull 剔除数组中所有满足给定条件的元素
  pullAll 剔除数组中所有等于给定值的元素

db.command.push

可指定插入更新对象的位置position,例如:

db.collection('todos').doc('doc-id').update({
  data: {
    tags: db.command.push({
      each: ['mini-program', 'cloud'],
      position: 1,
    })
  }
})

因此开始的思路为将数组N位置处的项删除,然后在同位置处插入修改后的数据。结果使用pull或pullAll时返回错误:

{\"errcode\":-605101,\"errmsg\":\"RuntimeError: cannot read property 'pullAll' (from line 1, col 78 to line 1, col 85)\\n\\n> 1 | db.collection('todos').doc('data_1_3_list').update({data:{list: db.command.pullAll('test')}})

意为pullAll解析失败。因此此种方法放弃。下面介绍使用数组匹配的方法进行更新数组中第N项数据:

匹配数组第 n 项元素

先来看看对第N项数据进行查询:

如果想找出数组字段中数组的第 n 个元素等于某个值的记录,那在  匹配中可以以 字段.下标 为 key,目标值为 value 来做匹配。如对上面的例子,如果想找出 number 字段第二项的值为 20 的记录,可以如下查询(注意:数组下标从 0 开始):

db.collection('todos').where({
  'list.1': 20
}).get()

那么对第N项数据进行更新:

db.collection('todos').doc('data_1_3_list').update({
  data: {
    'list.1': 30
  },
})

接来下将查询更新语句使用HTTP发送至微信小程序云服务器,更新数组中的第N个对象,查看效果:

 

QString query = tr("db.collection('clothes').doc('%1').update({"
                "data: {"
                  "'list.%2': {title:'%3', id:'%4',price:'%5',u:'%6'}"
                "},"
              "})").arg(currentClassifyId,QString::number(currentProductIndex),title,id,price,url);
QString errmsg = jsonDataModel->updateData(query);//currentProductIndex为当前选中位置Index

updataData(QString query)代码:

QString JsonDataModel::updateData(QString query){
    request->setUrl(QUrl(tr("https://api.weixin.qq.com/tcb/databaseupdate?access_token=%1").arg(Access_Token)));
    QJsonObject obj{
        {"query",query},
        {"env",env}
    };
    QByteArray objBy = QJsonDocument(obj).toJson();
    QNetworkReply* r = manager->post(*request,objBy);
    QEventLoop loop;
    connect(r, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();
    QByteArray ba = r->readAll();
    QJsonDocument js = QJsonDocument::fromJson(ba);
    QString errmsg = js["errmsg"].toString();
    r->deleteLater();
    return errmsg;
}

 

你可能感兴趣的:(QML,微信小程序云开发,网络,qt,小程序)