微信开发文档中对小程序云数据库更新的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>
匹配中可以以 字段.下标
为 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;
}