uni-app 云对象url化后,在进行update操作时,对一个字段赋值空对象以重置,但无法将数据库中该字段变成空对象

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

uni-app 云对象url化后,在进行update操作时,对一个字段赋值空对象以重置,但无法将数据库中该字段变成空对象

产品分类:uniCloud/App

操作步骤:

url化的云对象,在进行update时,对一个字段进行赋值空对象重置,会无法将数据库中该字段变成空对象。我再对user表的avatar_file字段进行update时,因为需要对头像进行置空,就将avatar_file={}进行update,结果发现数据库中该字段没有发生变化,必须将avatar_file={ extname: ‘’, name: ‘’, url: ‘’ }发送至数据库进行update,才会将数据库中的avatar_file字段变成{ extname: ‘’, name: ‘’, url: ‘’ }。然后我试着只将将avatar_file字段中某一属性例如url置空,就像这样avatar_file={ url: ‘’ }进行update,结果发现数据库中的avatar_file字段变成{ extname: ‘没变化还是原来的’, name: ‘没变化还是原来的’, url: ‘’ },就只将数据库中的avatar_file字段中的url置空了,其他属性都没变。按理说应该将数据库中的avatar_file字段update成我传入的avatar_file一样才对,我传入空对象就变成空对象,而不是像Object.assign那样覆盖,现在的感觉就是和Object.assign覆盖一样。

预期结果:

按理说应该将数据库中的avatar_file字段update成我传入的avatar_file一样才对,我传入空对象就变成空对象

实际结果:

我试着只将将avatar_file字段中某一属性例如url置空,就像这样avatar_file={ url: ‘’ }进行update,结果发现数据库中的avatar_file字段变成{ extname: ‘没变化还是原来的’, name: ‘没变化还是原来的’, url: ‘’ },就只将数据库中的avatar_file字段中的url置空了,其他属性都没变,感觉就是和Object.assign覆盖一样。

bug描述:

url化的云对象,在进行update时,对一个字段进行赋值空对象重置,会无法将数据库中该字段变成空对象。我再对user表的avatar_file字段进行update时,因为需要对头像进行置空,就将avatar_file={}进行update,结果发现数据库中该字段没有发生变化,必须将avatar_file={ extname: ‘’, name: ‘’, url: ‘’ }发送至数据库进行update,才会将数据库中的avatar_file字段变成{ extname: ‘’, name: ‘’, url: ‘’ }。然后我试着只将将avatar_file字段中某一属性例如url置空,就像这样avatar_file={ url: ‘’ }进行update,结果发现数据库中的avatar_file字段变成{ extname: ‘没变化还是原来的’, name: ‘没变化还是原来的’, url: ‘’ },就只将数据库中的avatar_file字段中的url置空了,其他属性都没变。按理说应该将数据库中的avatar_file字段update成我传入的avatar_file一样才对,我传入空对象就变成空对象,而不是像Object.assign那样覆盖,现在的感觉就是和Object.assign覆盖一样。


2 回复

这个不是bug,update的逻辑就是这样的, 如果你想要覆盖对象就要用到 set 操作符
const _ = db.command
let res = await db.collection(‘photo’).doc(‘doc-id’).update({
obj: _.set({
a: 1
})
}) 上面代码中 obj: _.set({
a: 1
}) 的作用就是覆盖obj字段为 {a:1}
而如果不使用 _.set
let res = await db.collection(‘photo’).doc(‘doc-id’).update({
obj: {
a: 1
}
}) 上面的代码效果是修改obj字段的子字段a为1


在使用 uni-app 的云对象进行数据库操作时,如果你尝试将一个字段更新为空对象({}),但发现数据库中该字段并没有被成功更新为空对象,可能是由于以下几个原因:

1. 数据库字段类型不匹配

确保数据库中的字段类型是 ObjectMap 类型。如果字段类型是其他类型(如 StringArray 等),直接赋值空对象可能会导致更新失败或数据被转换为其他类型。

2. 云函数中的更新操作

在云函数中,确保你使用的是正确的更新操作。例如,使用 db.collection('yourCollection').doc('yourDocId').update() 方法来更新文档。

const db = uniCloud.database();
const collection = db.collection('yourCollection');

await collection.doc('yourDocId').update({
  yourField: {} // 将 yourField 更新为空对象
});

3. 云对象的权限设置

检查云对象的权限设置,确保你有权限更新该字段。如果权限不足,更新操作可能会被拒绝。

4. 数据库的默认值或校验规则

检查数据库的默认值或校验规则,确保没有设置默认值或校验规则阻止字段被更新为空对象。

5. 云对象的日志和错误信息

查看云对象的日志和错误信息,确认是否有错误或警告信息提示更新失败的原因。

6. 使用 $set 操作符

在某些情况下,直接赋值空对象可能不会触发更新操作。你可以尝试使用 $set 操作符来明确指定更新操作。

const db = uniCloud.database();
const collection = db.collection('yourCollection');

await collection.doc('yourDocId').update({
  $set: {
    yourField: {} // 使用 $set 操作符将 yourField 更新为空对象
  }
});

7. 检查云对象的返回值

在云对象中,确保你正确处理了更新操作的返回值,并检查是否成功更新。

const res = await collection.doc('yourDocId').update({
  yourField: {}
});

if (res.updated > 0) {
  console.log('更新成功');
} else {
  console.log('更新失败');
}

8. 数据库的版本和兼容性

确保你使用的数据库版本和云对象版本是兼容的。某些数据库版本可能对空对象的处理方式有所不同。

9. 使用 $unset 操作符

如果你希望完全删除该字段,而不是将其设置为空对象,可以使用 $unset 操作符。

const db = uniCloud.database();
const collection = db.collection('yourCollection');

await collection.doc('yourDocId').update({
  $unset: {
    yourField: 1 // 删除 yourField 字段
  }
});
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!