【问题标题】:Querying on bson fields in Mongo DB using the native mongodb module for node使用节点的本机 mongodb 模块查询 Mongodb 中的 json 字段
【发布时间】:2014-11-26 12:29:33
【问题描述】:

我有一个使用 Mongo DB C# 驱动程序的程序填充了文档的 mongo 集合。

如果我运行查找

client.connect('mongodb://127.0.0.1:27017/foo', function(err, db) {
  var things = db.collection('things');
  things.find({}, ['ThingId']).limit(1).toArray(function(err, docs) {
    console.log(docs[0]);  
  }
}

查看存储的内容然后我看到类似

{ _id: 1234235341234, 事物ID: { _bsontype: '二进制', 子类型:3, 位置:16, 缓冲区: }}

我已经阅读了documentation 并尝试了以下内容:

console.log(mongojs.Binary(docs[i].SessionId.buffer, 3).value());

但我无法将 ThingId 作为 UUID 字符串打印到控制台

我绝对不能查询它!

我的目标是通过传入要查找的 GUID 字符串进行查询,以便我可以使用我知道 C# 生成的 Id 选择文档(并且可以使用 RoboMongo 查看)

非常感谢任何帮助!


更新: 正如@wes-widner 所指出的,mongo c# 驱动程序团队有一个UUID helper js 文件,可以帮助在不同的 UUID 之间进行转换,我们在 RoboMongo 中使用它来直接查询。但它使用的 BinData 仅在 mongo shell 中可用,我不知道如何使用节点访问它。

linked answer 展示了如何使用 uuidHelper 和 BinData 在使用 mongo shell 时进行查询基本上我要问的是如何在节点中执行此操作

【问题讨论】:

    标签: node.js mongodb bson


    【解决方案1】:

    不确定这是否是您要查找的内容,但当我访问此页面时,这正是我所要查找的内容。我有 java.util.UUID/fromString 在 Mongo 中创建了 UUID 作为主键,我想在 UI 中使用普通字符串 UUID。我正在使用node-mongodb-native

    var Binary = require('mongodb').Binary;
    var toUUID, toBinData;
    
    module.exports.toUUID = toUUID = function(binId) {
      var hex = binId.toString('hex');
      return 
        hex.substr(0, 8) + '-' + 
        hex.substr(8, 4) + '-' + 
        hex.substr(12, 4) + '-' + 
        hex.substr(16, 4) + '-' + 
        hex.substr(20, 12);
    };
    
    module.exports.toBinData = toBinData = function(uuid) {
      var buf = new Buffer(uuid.replace(/-/g, ''), 'hex');
      return new Binary(buf, Binary.SUBTYPE_UUID_OLD);  
    };
    

    更新

    事实证明,虽然上面的方法工作得很好(因为它以两种方式进行转换),但它不会产生与我在 Clojure 代码中看到的相同的字符串 UUID。但是同样的uuidhelpers 可以救援 - 下面适用于 Java 旧版 UUID。

    var Binary = require('mongodb').Binary;
    var toJUUID, toBinData;
    
    module.exports.toJUUID = toJUUID = function(binId) {
      var hex = binId.buffer.toString('hex');
      var msb = hex.substr(0, 16);
      var lsb = hex.substr(16, 16);
      msb = msb.substr(14, 2) + msb.substr(12, 2) + msb.substr(10, 2) + msb.substr(8, 2) + msb.substr(6, 2) + msb.substr(4, 2) + msb.substr(2, 2) + msb.substr(0, 2);
      lsb = lsb.substr(14, 2) + lsb.substr(12, 2) + lsb.substr(10, 2) + lsb.substr(8, 2) + lsb.substr(6, 2) + lsb.substr(4, 2) + lsb.substr(2, 2) + lsb.substr(0, 2);
      hex = msb + lsb;
      return hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12);
    };
    
    module.exports.toBinData = toBinData = function(uuid) {
      var hex = uuid.replace(/[{}-]/g, "");
      var msb = hex.substr(0, 16);
      var lsb = hex.substr(16, 16);
      msb = msb.substr(14, 2) + msb.substr(12, 2) + msb.substr(10, 2) + msb.substr(8, 2) + msb.substr(6, 2) + msb.substr(4, 2) + msb.substr(2, 2) + msb.substr(0, 2);
      lsb = lsb.substr(14, 2) + lsb.substr(12, 2) + lsb.substr(10, 2) + lsb.substr(8, 2) + lsb.substr(6, 2) + lsb.substr(4, 2) + lsb.substr(2, 2) + lsb.substr(0, 2);
      hex = msb + lsb;
      return new Binary(new Buffer(hex, 'hex'), Binary.SUBTYPE_UUID_OLD);
    };
    

    按照相同的复制/粘贴方法,您可以从帮助程序中剥离有效的 C# 代码。您只需要稍微不同地处理缓冲区。

    【讨论】:

    • 谢谢,我放弃了,只是使用 C# 编写了我需要的工具,所以我不会遇到 UUID 问题。希望这对其他人有所帮助!
    猜你喜欢
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    相关资源
    最近更新 更多