尝试使用 mongodb 读取 nodejs 中的数据,这些数据是使用 C# 和 GUID 保存的
Trying to read data in nodejs with mongodb which is persisted using C# with GUIDs
我看到了一些关于此的问题,但其中 none 似乎直接解决了这里的问题。
所以场景是有一个基于 C# 的 API 将数据写入 mongodb 实例并使用 GUID 作为 mongo 中的 _id
,所以例如它看起来像:
"_id" : new BinData(3, "+jscvebAl0+NO0n1WySLTQ=="),
所以假设它不会改变,它将永远是那个数据类型,我对此无能为力。
所以在 nodejs 中,我读了一个文档,其中包含一些与其他资源相关的 UUID,但是当我使用 nodejs 2.0 驱动程序读入文档时,UUID 变量被读入为 GUID 字符串,如下所示:
"someIdField": "c1489470-4e04-49ba-ae91-a20c009254e5"
所以如果我直接使用 { "_id" : someIdField }
它找不到匹配的文档,我假设它是因为它需要与二进制表示进行比较,而不是字符串表示,但是我似乎无法把那个字符串变成有价值的东西。
我试过使用 npm uuid
包来解析然后像这样使用该缓冲区:
var bytes = Uuid.parse(uuid);
return new Binary(new Buffer(bytes), 3);
但这似乎不起作用,我尝试了其他解决方案,包括 base64 编码,但似乎没有任何结果。那么我还需要在这里做什么吗?
您的 _id
存储为 BSON 二进制数据类型。
when I read in the documents using the nodejs 2.0 driver the UUID vars are read in as GUID strings
我认为这是将它们字符串化的产物 - 它们不可能以 BinData 的形式存储在 C# 中并由 Node.js 作为字符串检索。
使用binaryclass构造Node.js中的BinData值。
好的,所以我已经开始工作了,这很痛苦,但是在查看了 UUIDHelpers 和 Whosebug 上的一些其他代码之后,这似乎是我获取东西所需的方法 运行:
module.exports = function(uuid) {
var hex = uuid.replace(/[{}-]/g, ""); // remove extra characters
var a = hex.substr(6, 2) + hex.substr(4, 2) + hex.substr(2, 2) + hex.substr(0, 2);
var b = hex.substr(10, 2) + hex.substr(8, 2);
var c = hex.substr(14, 2) + hex.substr(12, 2);
var d = hex.substr(16, 16);
hex = a + b + c + d;
var buffer= new Buffer(hex, "hex");
return new Binary(buffer, Binary.SUBTYPE_UUID_OLD);
};
这应该将文本 guid 转换为旧版 guid 的二进制表示。
我看到了一些关于此的问题,但其中 none 似乎直接解决了这里的问题。
所以场景是有一个基于 C# 的 API 将数据写入 mongodb 实例并使用 GUID 作为 mongo 中的 _id
,所以例如它看起来像:
"_id" : new BinData(3, "+jscvebAl0+NO0n1WySLTQ=="),
所以假设它不会改变,它将永远是那个数据类型,我对此无能为力。
所以在 nodejs 中,我读了一个文档,其中包含一些与其他资源相关的 UUID,但是当我使用 nodejs 2.0 驱动程序读入文档时,UUID 变量被读入为 GUID 字符串,如下所示:
"someIdField": "c1489470-4e04-49ba-ae91-a20c009254e5"
所以如果我直接使用 { "_id" : someIdField }
它找不到匹配的文档,我假设它是因为它需要与二进制表示进行比较,而不是字符串表示,但是我似乎无法把那个字符串变成有价值的东西。
我试过使用 npm uuid
包来解析然后像这样使用该缓冲区:
var bytes = Uuid.parse(uuid);
return new Binary(new Buffer(bytes), 3);
但这似乎不起作用,我尝试了其他解决方案,包括 base64 编码,但似乎没有任何结果。那么我还需要在这里做什么吗?
您的 _id
存储为 BSON 二进制数据类型。
when I read in the documents using the nodejs 2.0 driver the UUID vars are read in as GUID strings
我认为这是将它们字符串化的产物 - 它们不可能以 BinData 的形式存储在 C# 中并由 Node.js 作为字符串检索。
使用binaryclass构造Node.js中的BinData值。
好的,所以我已经开始工作了,这很痛苦,但是在查看了 UUIDHelpers 和 Whosebug 上的一些其他代码之后,这似乎是我获取东西所需的方法 运行:
module.exports = function(uuid) {
var hex = uuid.replace(/[{}-]/g, ""); // remove extra characters
var a = hex.substr(6, 2) + hex.substr(4, 2) + hex.substr(2, 2) + hex.substr(0, 2);
var b = hex.substr(10, 2) + hex.substr(8, 2);
var c = hex.substr(14, 2) + hex.substr(12, 2);
var d = hex.substr(16, 16);
hex = a + b + c + d;
var buffer= new Buffer(hex, "hex");
return new Binary(buffer, Binary.SUBTYPE_UUID_OLD);
};
这应该将文本 guid 转换为旧版 guid 的二进制表示。