uni-app JQL更新数组时 以数组下标作为key 报数据库验证失败
uni-app JQL更新数组时 以数组下标作为key 报数据库验证失败
产品分类
uniCloud/App
示例代码
const db = uniCloud.database();
let collection = db.collection("table1")
let res = await collection.where({_id:'doc-id'})
.update({
arr: {
1: "uniCloud"
}
})
操作步骤
更新数组时,以数组下标作为key
预期结果
数据库数组字段更新成功
实际结果
更新失败,数据库报错
bug描述
JQL文档里面的说明: 更新数组时,以数组下标作为key即可,比如以下示例将数组arr内下标为1的值修改为 uniCloud
const db = uniCloud.database();
let collection = db.collection("table1")
let res = await collection.where({_id:'doc-id'})
.update({
arr: {
1: "uniCloud"
}
})
按此方法,数据库会报错: 数据库验证失败:[“xxx(字段名)”]类型无效
@DCloud_HB_WJ 官方不解决下这个问题吗
async upSeenList(uid,num){
await db.collection(“uni-id-users”).doc(uid).update({
seenlist:{
1:'a'
}
})
}
我的这样可以,但是把下标 1 换成变量就不行了,好像是语法不支持
我也碰上了同样的问题,照官方文档写也不行,但看B站教程,2022年的咸虾米视频中,人家是可以的,也不知道是不是因为版本更新后就不行了,如果这样,官方也不作一下说明太坑了。
在uni-app中,使用JQL(可能是指类似SQL的查询语言,但在uni-app中通常指的是对本地或云数据库的查询操作)更新数组时,如果以数组下标作为key可能会导致数据库验证失败,因为大多数数据库设计并不支持直接使用数组下标作为字段的key。通常,数组元素是通过某种唯一标识符(如ID)来区分的。
以下是一个示例,展示了如何在uni-app中处理数组的更新,避免使用数组下标作为key,而是使用唯一标识符(如ID)。
示例场景
假设我们有一个名为items
的数组,每个元素都有一个唯一的id
字段。
数据库表结构(假设为云数据库)
{
"_id": "ObjectId",
"name": "string",
"items": [
{
"id": "number",
"value": "string"
}
]
}
更新数组元素的代码示例
- 查询数据库中的记录
uniCloud.database().collection('collectionName').doc('documentId').get()
.then(res => {
const data = res.result.data[0];
// 假设我们要更新items数组中id为2的元素
const updatedItem = data.items.find(item => item.id === 2);
if (updatedItem) {
updatedItem.value = 'newValue';
// 更新数据库
return uniCloud.database().collection('collectionName').doc('documentId').update({
data: {
items: data.items
}
});
}
})
.catch(err => {
console.error(err);
});
- 使用事务确保数据一致性(可选)
如果更新操作涉及多个字段或需要更高的数据一致性,可以使用事务:
uniCloud.database().runTransaction(tx => {
return tx.collection('collectionName').doc('documentId').get()
.then(res => {
const data = res.result.data[0];
const updatedItem = data.items.find(item => item.id === 2);
if (updatedItem) {
updatedItem.value = 'newValue';
return tx.collection('collectionName').doc('documentId').update({
data: {
items: data.items
}
});
}
});
})
.then(res => {
console.log('Transaction succeeded:', res);
})
.catch(err => {
console.error('Transaction failed:', err);
});
结论
在更新数组时,应避免使用数组下标作为key,而是使用唯一标识符(如ID)。这样可以确保数据库操作的准确性和一致性,避免验证失败的问题。以上代码示例展示了如何在uni-app中更新数组元素,并确保数据更新的正确性。