Запрос полей bson в базе данных Mongo с использованием собственного модуля mongodb для узла

У меня есть коллекция монго, которая была заполнена документами программой, использующей драйвер С# Mongo DB.

Если я найду

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, чтобы найти, чтобы я мог выбирать документы, используя идентификаторы, которые я знаю, сгенерированные С# (и могу видеть с помощью RoboMongo)

Любая помощь очень ценится!


Обновление: как указал @wes-widner, команда драйверов mongo c# имеет вспомогательный js-файл UUID, который помогает конвертировать между различными UUID, и мы используем его в RoboMongo для прямого запроса. Но BinData, который он использует, доступен только в оболочке mongo, и я не знаю, как получить к нему доступ с помощью node.

связанный ответ показывает, как выполнять запросы с использованием uuidHelper и BinData при использовании оболочки mongo, по сути, что я спрашивать, как это сделать в узле


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