uni-app 云对象url化后,在进行update操作时,对一个字段赋值空对象以重置,但无法将数据库中该字段变成空对象
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覆盖一样。
这个不是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. 数据库字段类型不匹配
确保数据库中的字段类型是 Object
或 Map
类型。如果字段类型是其他类型(如 String
、Array
等),直接赋值空对象可能会导致更新失败或数据被转换为其他类型。
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 字段
}
});