uni-app JQL更新数组时 以数组下标作为key 报数据库验证失败

发布于 1周前 作者 songsunli 来自 Uni-App

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(字段名)”]类型无效


4 回复

@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"
    }
  ]
}

更新数组元素的代码示例

  1. 查询数据库中的记录
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);
  });
  1. 使用事务确保数据一致性(可选)

如果更新操作涉及多个字段或需要更高的数据一致性,可以使用事务:

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中更新数组元素,并确保数据更新的正确性。

回到顶部