使用本地mongodb模块查询MongoDB中的bson字段

我有一个使用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,ThingID:{_bsontype:'Binary',sub_type:3,position:16,buffer:<Buffer a2 96 8d 7f fa e4 a4 48 b4 80 4a 19 f3 32 df 8e>}}

我已经阅读了文档,并尝试如下的东西:

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

但是我不能将ThingId作为UUIDstring打印到控制台

我绝对不能查询它!

我的目标是通过传递GUIDstring来查询,以便我可以使用Idsselect文档我知道生成的C#(可以看到使用RoboMongo)

任何帮助非常感谢!


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

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

真的不知道这是你在找什么,但是当我到达这个页面时,这就是我正在寻找的东西。 我有java.util.UUID/fromString创build的UUID作为Mongo中的主键,我想在UI中使用正常的stringUUID。 我正在使用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); }; 

更新

事实certificate,虽然上面的工作很好(因为它做转换类似于两种方式)它不会产生相同的stringUUID,我在我的Clojure代码中看到。 但是相同的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#代码。 你只需要处理缓冲区有点不同。