【问题标题】:Trying to read data in nodejs with mongodb which is persisted using C# with GUIDs尝试使用带有 GUID 的 C# 持久化的 mongodb 读取 nodejs 中的数据
【发布时间】:2015-04-22 15:10:56
【问题描述】:

我已经看到了一些与此相关的问题,但似乎没有一个可以直接解决这里的问题。

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

【问题讨论】:

    标签: c# node.js mongodb uuid bson


    【解决方案1】:

    好的,所以我已经开始工作了,这很痛苦,但是在查看了 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 的二进制表示。

    【讨论】:

      【解决方案2】:

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

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

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

      使用 binary 类在 Node.js 中构造 BinData 值。

      【讨论】:

      • 它很可能是日志记录过程的一部分,它将显示 GUID 的字符串化,但是如前所述,默认情况下它找不到匹配的文档,并且我尝试将变量直接添加到 @ 987654323@ 这也不起作用。
      猜你喜欢
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      相关资源
      最近更新 更多