Robo 3T: введите фактические значения вызовов функций Javascript при экспорте коллекций в JSON - PullRequest
0 голосов
/ 07 февраля 2020

Я очень новичок в пн go и имею требование экспортировать коллекцию в JSON. Я запустил приведенный ниже код для экспорта в JSON, и он работал нормально. Но главная проблема в том, что есть некоторые функции, для которых значение в Robo3T GUI отличается от экспортируемого.

var cursor = db.getCollection('foo').find({}, {});
while(cursor.hasNext()) {
    print(tojson(cursor.next()))
}

Но главная проблема заключается в том, что есть некоторые функции, для которых значение отличается в Robo3T GUI по сравнению с тем, что экспортируется. Пример: "_id": BinData (3, "u9LO8nOI6UmsYJUin / DH8w ==") - это то, что экспортируется в JSON, тогда как в GUI это ("f2ced2bb-8873-49e9-ac60-95229ff0c7f3").

Я хочу экспортировать значения точно так, как видно на Robo3T GUI.

1 Ответ

0 голосов
/ 20 февраля 2020

Наконец-то после всех исследований получен ответ. Опубликуйте его ниже, чтобы другие, сталкивающиеся с той же проблемой, могли воспользоваться. Формат Bindata - BSON, а тот, который виден из оболочки mon go, имеет шестнадцатеричную форму NUUID, CSUUID, PYUUID или что-то еще. Я хотел конвертировать BinData в формат NUUID. Запустите две следующие функции на своей консоли:

   function Base64ToHex(base64) {
        var base64Digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
        var hexDigits = "0123456789abcdef";
        var hex = "";
        for (var i = 0; i < 24; ) {
            var e1 = base64Digits.indexOf(base64[i++]);
            var e2 = base64Digits.indexOf(base64[i++]);
            var e3 = base64Digits.indexOf(base64[i++]);
            var e4 = base64Digits.indexOf(base64[i++]);
            var c1 = (e1 << 2) | (e2 >> 4);
            var c2 = ((e2 & 15) << 4) | (e3 >> 2);
            var c3 = ((e3 & 3) << 6) | e4;
            hex += hexDigits[c1 >> 4];
            hex += hexDigits[c1 & 15];
            if (e3 != 64) {
                hex += hexDigits[c2 >> 4];
                hex += hexDigits[c2 & 15];
            }
            if (e4 != 64) {
                hex += hexDigits[c3 >> 4];
                hex += hexDigits[c3 & 15];
            }
        }
        return hex;
    }

BinData.prototype.toNUUID = function () {
    var hex = Base64ToHex(this.base64()); // don't use BinData's hex function because it has bugs in older versions of the shell
    var a = hex.substr(6, 2) + hex.substr(4, 2) + hex.substr(2, 2) + hex.substr(0, 2);
    var b = hex.substr(10, 2) + hex.substr(8, 2);
    var c = hex.substr(14, 2) + hex.substr(12, 2);
    var d = hex.substr(16, 16);
    hex = a + b + c + d;
    var uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12);
    return uuid;
}

и затем вызовите функцию в вашем извлечении, как показано ниже:

var cursor = db.getCollection('collectionname').find({});
while(cursor.hasNext()) {
var b=cursor.next()
b._id=b._id.toNUUID()
    print(tojson(b))
}

Это позволит извлечь данные в желаемом формате NUUID или столбец в JSON.

...