'use strict';
const db = uniCloud.database();
const cmd = db.command;
const $ = cmd.aggregate;
const table = db.collection("a-testA")
exports.main = async (event, context) => {
let _id = "66bb7ba721821b4304c62c55";
let name = "0053004F3938343701473231";
//await table.add({_id,name});
console.info(" 更新前的name ",name);
await table.doc( _id ).update({name});
let res = await table.doc( _id ).get();
let item = res.data[0];
console.info(" 更新后的name ",item.name);
console.info("两者 ",(item.name == name)?"相同":"不相同");
return event
};
- 发布:2024-08-14 00:36
- 更新:2024-08-14 12:05
- 阅读:228
产品分类: uniCloud/App
示例代码:
操作步骤:
'use strict';
const db = uniCloud.database();
const cmd = db.command;
const $ = cmd.aggregate;
const table = db.collection("a-testA")
exports.main = async (event, context) => {
let _id = "66bb7ba721821b4304c62c55";
let name = "0053004F3938343701473231";
//await table.add({_id,name});
console.info(" 更新前的name ",name);
await table.doc( _id ).update({name});
let res = await table.doc( _id ).get();
let item = res.data[0];
console.info(" 更新后的name ",item.name);
console.info("两者 ",(item.name == name)?"相同":"不相同");
return event
};
先执行await table.add({_id,name});
然后注释掉,执行其他代码。
'use strict';
const db = uniCloud.database();
const cmd = db.command;
const $ = cmd.aggregate;
const table = db.collection("a-testA")
exports.main = async (event, context) => {
let _id = "66bb7ba721821b4304c62c55";
let name = "0053004F3938343701473231";
//await table.add({_id,name});
console.info(" 更新前的name ",name);
await table.doc( _id ).update({name});
let res = await table.doc( _id ).get();
let item = res.data[0];
console.info(" 更新后的name ",item.name);
console.info("两者 ",(item.name == name)?"相同":"不相同");
return event
};
先执行await table.add({_id,name});
然后注释掉,执行其他代码。
预期结果:
更新前的name 0053004F3938343701473231
更新后的name 0053004F3938343701473231
两者 相同
更新前的name 0053004F3938343701473231
更新后的name 0053004F3938343701473231
两者 相同
实际结果:
更新前的name 0053004F3938343701473231
更新后的name 0053004f3938343701473231
两者 不相同
更新前的name 0053004F3938343701473231
更新后的name 0053004f3938343701473231
两者 不相同
bug描述:
【bug描述】
我数据有个字符串字段,值是"0053004F3938343701473231",结果保存的时候变成了"0053004f3938343701473231"
中间的F变成了小写的。关键这是设备ID,我又不能随便改。现在是这个设备ID用不了。我只能想其它办法保存。
为了方便描述问题,我建了一个测试表。把代码简化。
2张附件的截图是,使用阿里云的复现的问题。数据库我也看了就是小写的。第2张图是腾讯云空间的运行效果。没有任何问题。
【带来的影响】
比如加个保存加个前缀,XX_,取出来的时候再去掉前缀。这样虽然能解决目前的问题。但是反馈出来确实阿里云mongodb的严重bug。以后谁还敢存这样的字符串啊。鬼知道它什么时候变成小写了。晕死。如果这个问题得不到解决,我就要把所有的项目换成了腾讯云。手动迁移数据库。哎。帮忙解决下。
最佳回复
建议手动生成的字符串长度不要24位,因为24位的字符串如果可以转ObjectId, 那么阿里云会强制转ObjectId格式,且会自动转小写,且内部存储的时候已经不是字符串格式,而是ObjectId类型(此时如果用正则查询是会报错的,说明Ta已经不是字符串了)
注意:此问题不只在阿里云会出现,腾讯云部分情况下也会出现的,但支付宝云则永远不会出现,因为阿里云的数据库底层是原生MongoDB,在存字符串的时候,如果能满足24位ObjectId格式的字符串,则会强制转Objectid,而腾讯云是基于原生MongoDB改造的数据库,支付宝的云数据库的底层更是非原生MongoDB,而是支付宝自研的基于MongoDB协议的数据库,在支付宝这没有ObjectId格式,所以没有问题。
特别注意:腾讯云也不应该存24位的ObjectId格式,可能会导致根据这个字段查询查不到数据的(腾讯云自身自研的bug,无法解决),所以腾讯云的_id是32位的纯字符串,而支付宝云没有这些问题
Haiger412666 (作者) - sd
感谢答复。这个字符串不是我这边定的。是因为我的项目要对接第三方系统。第三方系统给的设备id就是这个。所以我没办法规避。不过目前也有解决办法。就是加个后缀。
比如dev_id="0053004F3938343701473231"
实际存,我就存0053004F3938343701473231_xxxxx
取出来,devid.split(‘’)[0].trim();也可以。
只能先这样应付了。感谢管理员的回复!此问题结束。谢谢!
Haiger412666 (作者)
感谢答复。这个字符串不是我这边定的。是因为我的项目要对接第三方系统。第三方系统给的设备id就是这个。所以我没办法规避。不过目前也有解决办法。就是加个后缀。
比如dev_id="0053004F3938343701473231"
实际存,我就存0053004F3938343701473231_xxxxx
取出来,devid.split("_")[0].trim();也可以。
只能先这样应付了。感谢管理员的回复!此问题结束。谢谢!
2024-08-14 12:05