尝试使用 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 的二进制表示。