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

我已经看到了一些这方面的问题,但他们都没有直接解决这个问题。

所以情况是有一个基于C#的API,它将数据写入一个MongoDB实例,并使用一个GUID作为mongo中的_id ,所以例如:

"_id" : new BinData(3, "+jscvebAl0+NO0n1WySLTQ=="),

所以假设它不会改变,它将永远是那种数据types,我无能为力。

所以在nodejs中,我读取的文档中包含一些与其他资源相关的UUID,但是当我使用nodejs 2.0驱动程序读取文档时,UUID vars被读作GUIDstring,如下所示:

"someIdField": "c1489470-4e04-49ba-ae91-a20c009254e5"

所以,如果我直接使用{ "_id" : someIdField }它找不到匹配的文档,我假设它是因为它需要比较二进制表示,而不是string之一,但我似乎无法将该string变成有价值的东西。

我已经尝试使用npm uuid包parsing,然后像这样使用该缓冲区:

 var bytes = Uuid.parse(uuid); return new Binary(new Buffer(bytes), 3); 

然而,这似乎并没有工作,我已经尝试了其他的解决scheme,包括base64编码,但似乎没有带回结果。 那么还有什么我需要在这里做的?

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

 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二进制数据types。

当我使用nodejs 2.0驱动程序读取文档时,UUIDvariables被作为GUIDstring读入

我认为这是一个对它们进行string化的工具 – 不能将它们作为BinData存储在C#中,而是通过Node.js作为string检索。

使用二进制类来构造Node.js中的BinData值。