我有一个mongo集合,它使用Mongo DB 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:' Binary', sub_type:3, 位置:16, 缓冲液:<缓冲液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字符串进行查询以便查找,这样我就可以使用我知道生成C#的ID来选择文档(并且可以看到使用RoboMongo)
任何帮助都非常赞赏!
更新: 正如@ wes-widner所指出的,mongo c#驱动程序团队有一个UUID helper js文件,可以帮助在不同的UUID之间进行转换,我们在RoboMongo中使用它来直接查询。但它使用的BinData仅在mongo shell上可用,我不知道如何使用节点访问它。
linked answer显示了在使用mongo shell时如何使用uuidHelper和BinData 进行查询本质上我想问的是如何在节点内执行此操作
答案 0 :(得分:2)
不确定这是否是您正在寻找的东西,但这是我到达此页面时所寻找的内容。我有java.util.UUID/fromString
创建了UUID作为Mongo中的主键,我想在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#代码。您只需稍微处理缓冲区。