2014-09-05 50 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