首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用原生mongodb模块为节点查询Mongo DB中的bson字段

使用原生mongodb模块为节点查询Mongo DB中的bson字段
EN

Stack Overflow用户
提问于 2014-09-05 17:15:13
回答 1查看 1.8K关注 0票数 2

我有一个mongo集合,它已经被一个使用Mongo C#驱动程序的程序填充了文档。

如果我查到了

代码语言:javascript
复制
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,ThingID:{ _bsontype:‘二进制’,sub_type: 3,位置: 16,缓冲区:< a2 96 8d 7f fa e4 a4 48 b4 80 4a 19 f3 32 df 8e> }

我读过文档,并尝试过这样的方法:

代码语言:javascript
复制
console.log(mongojs.Binary(docs[i].SessionId.buffer, 3).value());

但是我不能将ThingId作为UUID字符串输出到控制台

我绝对不能质疑它!

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

任何帮助都是非常感谢的!

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

链接答案展示了如何在使用mongo 时使用uuidHelper和BinData 进行查询,本质上,我想问的是如何在节点内进行查询。

EN

回答 1

Stack Overflow用户

发布于 2014-11-21 06:15:18

不太确定这是不是你要找的东西,但当我到达这个页面时,这就是我要找的东西。我已经在java.util.UUID/fromString中创建了UUID作为主键,我希望在UI中使用普通的字符串UUID。我正在使用node-mongodb-native

代码语言:javascript
复制
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。但是,下面的尤伊德助手也适用于Java旧式UUID。

代码语言:javascript
复制
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#代码。你只需要处理一些不同的缓冲区。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25690887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档