我有一个mongo集合,它已经被一个使用Mongo C#驱动程序的程序填充了文档。
如果我查到了
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> }
我读过文档,并尝试过这样的方法:
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 进行查询,本质上,我想问的是如何在节点内进行查询。
发布于 2014-11-21 06:15:18
不太确定这是不是你要找的东西,但当我到达这个页面时,这就是我要找的东西。我已经在java.util.UUID/fromString中创建了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。但是,下面的尤伊德助手也适用于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#代码。你只需要处理一些不同的缓冲区。
https://stackoverflow.com/questions/25690887
复制相似问题