Извършване на заявки за bson полета в Mongo DB с помощта на собствения модул mongodb за възел

Имам колекция 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, 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 като UUID низ на конзолата

и определено не мога да питам за него!

Целта ми е да направя заявка, като предам GUID низовете, за да намеря, за да мога да избирам документи, използвайки идентификатори. Знам, че C# е генериран (и мога да видя с помощта на RoboMongo)

Всяка помощ се оценява изключително много!


Актуализация: Както беше посочено от @wes-widner, екипът на драйверите на mongo c# има UUID helper js файл, който помага за конвертирането между различни UUID и ние го използваме в RoboMongo за директни заявки. Но BinData, който използва, е наличен само в mongo shell и не знам как да осъществя достъп до него чрез node.

Свързаният отговор показва как да правите заявки с помощта на uuidHelper и BinData когато използвате mongo shell по същество какво Im питането е как да направите това в рамките на възел


person Paul D'Ambra    schedule 05.09.2014    source източник


Отговори (1)


Не съм много сигурен дали това е, което търсите, но точно това търсех, когато стигнах до тази страница. Създадох java.util.UUID/fromString UUID като първични ключове в Mongo и искам да използвам нормалния низ 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 на помощ - по-долу работи за наследените UUID на Java.

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# код от помощниците. Трябва само да боравите с буферите малко по-различно.

person vesse    schedule 21.11.2014
comment
благодаря, отказах се и просто написах инструмента, от който се нуждаех, използвайки C#, за да нямам проблема с UUID. Надяваме се, че това ще помогне на някой друг! - person Paul D'Ambra; 24.11.2014