2014-09-05 81 views
2

我有一个使用Mongo DB C#驱动程序的程序填充了文档的mongo集合。使用本地mongodb模块为节点查询Mongo DB中的bson字段

如果我运行一个发现

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, position:16, buffer:< Buffer a2 96 8d 7f fa e4 a4 48 b4 80 4a 19 f3 32 df 8e >}}

我读过documentation和尝试之类的东西:

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

,但我不能打印ThingId作为UUID字符串到控制台

,我绝对无法查询上它!

我的目标是通过传递GUID字符串查询发现,所以我可以选择使用IDS我知道生成的C#文件(可以看到使用RoboMongo)

任何帮助表示赞赏巨大!


更新: 正如指出的那样@ WES-威德纳蒙戈C#的驾驶员队伍有一个UUID helper js文件,可以帮助不同的UUID之间的转换,我们使用,在RoboMongo直接查询。但是它使用的BinData仅在mongo shell中可用,我不知道如何使用节点访问它。

linked answer展示了如何使用蒙戈外壳基本上什么林问的是如何做到在使用uuidHelper和BinData 查询该节点内

回答

2

不能确定,如果这是你在找什么,但它是当我到达这个页面时我正在寻找什么。我有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); 
}; 

更新

原来,虽然上面的作品就好了(因为它的转换类似于双向)也不会产生相同的字符串UUID我在我的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#代码。你只需要处理缓冲区有点不同。

+0

谢谢,我放弃了,只是写了我需要使用C#的工具,所以我不会有UUID问题。希望这可以帮助别人! – 2014-11-24 20:40:14