Haiger412666
Haiger412666
  • 发布:2024-08-14 00:36
  • 更新:2024-08-14 12:05
  • 阅读:228

【重大Bug】按量付费版阿里云mongodb把字符串字段的值从大写字变小写了

分类:uniCloud

产品分类: 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
};

操作步骤:

'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  
  两者  不相同

bug描述:

【bug描述】
我数据有个字符串字段,值是"0053004F3938343701473231",结果保存的时候变成了"0053004f3938343701473231"
中间的F变成了小写的。关键这是设备ID,我又不能随便改。现在是这个设备ID用不了。我只能想其它办法保存。

为了方便描述问题,我建了一个测试表。把代码简化。
2张附件的截图是,使用阿里云的复现的问题。数据库我也看了就是小写的。第2张图是腾讯云空间的运行效果。没有任何问题。

【带来的影响】
比如加个保存加个前缀,XX_,取出来的时候再去掉前缀。这样虽然能解决目前的问题。但是反馈出来确实阿里云mongodb的严重bug。以后谁还敢存这样的字符串啊。鬼知道它什么时候变成小写了。晕死。如果这个问题得不到解决,我就要把所有的项目换成了腾讯云。手动迁移数据库。哎。帮忙解决下。

2024-08-14 00:36 负责人:无 分享
已邀请:

最佳回复

DCloud_uniCloud_VK

DCloud_uniCloud_VK

建议手动生成的字符串长度不要24位,因为24位的字符串如果可以转ObjectId, 那么阿里云会强制转ObjectId格式,且会自动转小写,且内部存储的时候已经不是字符串格式,而是ObjectId类型(此时如果用正则查询是会报错的,说明Ta已经不是字符串了)

注意:此问题不只在阿里云会出现,腾讯云部分情况下也会出现的,但支付宝云则永远不会出现,因为阿里云的数据库底层是原生MongoDB,在存字符串的时候,如果能满足24位ObjectId格式的字符串,则会强制转Objectid,而腾讯云是基于原生MongoDB改造的数据库,支付宝的云数据库的底层更是非原生MongoDB,而是支付宝自研的基于MongoDB协议的数据库,在支付宝这没有ObjectId格式,所以没有问题。

特别注意:腾讯云也不应该存24位的ObjectId格式,可能会导致根据这个字段查询查不到数据的(腾讯云自身自研的bug,无法解决),所以腾讯云的_id是32位的纯字符串,而支付宝云没有这些问题

  • Haiger412666 (作者)

    感谢答复。这个字符串不是我这边定的。是因为我的项目要对接第三方系统。第三方系统给的设备id就是这个。所以我没办法规避。不过目前也有解决办法。就是加个后缀。


    比如dev_id="0053004F3938343701473231"


    实际存,我就存0053004F3938343701473231_xxxxx


    取出来,devid.split("_")[0].trim();也可以。


    只能先这样应付了。感谢管理员的回复!此问题结束。谢谢!

    2024-08-14 12:05

Haiger412666

Haiger412666 (作者) - sd

感谢答复。这个字符串不是我这边定的。是因为我的项目要对接第三方系统。第三方系统给的设备id就是这个。所以我没办法规避。不过目前也有解决办法。就是加个后缀。

比如dev_id="0053004F3938343701473231"

实际存,我就存0053004F3938343701473231_xxxxx

取出来,devid.split(‘’)[0].trim();也可以。

只能先这样应付了。感谢管理员的回复!此问题结束。谢谢!

要回复问题请先登录注册