首页 > 解决方案 > Mongodb中重复键错误消息中的unhex字段如何

问题描述

我将两个地址都用作城市字段作为唯一的复合索引。当我导入 CSV 时,我会使用 upsert 进行批量更新。因此现有的密钥得到更新,不存在的密钥被插入。

由于排序规则设置(例如“Amsterdam”和“amsterdam”相同),我得到重复的键错误。

我很难解码错误信息。这是我收到的示例消息: E11000 duplicate key error collection: database.collection index: c_address collation: { locale: "nl", caseLevel: false, caseFirst: "off", strength: 1, numericOrdering: false, alternate: "non-ignorable", maxVariable: "punct", normalization: false, backwards: false, version: "57.1" } dup key: { address: "0x3f313f39314d4f4b29294f041414", city: "0x31434d2d37312f31" }

与最相关的部分: { address: "0x3f313f39314d4f4b29294f041414", city: "0x31434d2d37312f31" }

我发现 MongoDB 十六进制编码消息,否则驱动程序将返回无效的 UTF-8。 https://jira.mongodb.org/browse/SERVER-46810 来源: https ://github.com/mongodb/mongo/commit/0e8998afb31300f39bc63af4a745a437b07ff977

我想用 PHP 解码十六进制字符串。解码 3f313f39314d4f4b29294f041414 会给我:?1?91MOK))O。

我认为这是一些 UTF8 编码问题。我也尝试用 BSON 解码它,它给出:“1CM-71/1”

$dehex = hex2bin("31434d2d37312f31");
$dehex = iconv('UTF-8', 'UTF-8//TRANSLIT', $dehex);
$binary = new MongoDB\BSON\Binary($dehex, MongoDB\BSON\Binary::TYPE_GENERIC);
var_dump($binary->getData());

我想让这个人类可读,这样我就可以检查哪些键有问题。

标签: phpmongodb

解决方案


推荐阅读