尝试使用mongodb读取nodejs中的数据,mongodb是使用带有GUID的C#持久化的



我看到了一些关于这方面的问题,但似乎没有一个能直接解决这里的问题。

因此,场景是有一个基于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编码,但似乎没有什么结果。那么我还有什么需要在这里做的吗?

好的,所以我已经让它工作了,这很痛苦,但在查看了UUIDHelpers和stackerflow上的一些其他代码后,似乎这是我运行东西所需要的方法:

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的二进制表示。

您的_id存储为BSON二进制数据类型。

当我使用nodejs 2.0驱动程序读取文档时,UUID变量将作为GUID字符串读取

我认为这是对它们进行字符串化的产物——它们不可能作为BinData存储在C#中,并由Node.js作为字符串检索。

使用二进制类在Node.js.中构造BinData值

最新更新