Использование MongooseJS для изменения Mongodb _id на BSON UUID для ref - PullRequest
0 голосов
/ 16 ноября 2018

В настоящее время я использую MongooseJS, чтобы изменить «_id» для каждой из моих коллекций на UDID BSON.Кроме того, я использую виртуальный «id» для преобразования «_id» в его строковый эквивалент.Он работает довольно хорошо и дает мне преимущество использования UUID для «_id», а не сохранения его в виде строки, которая тратит ресурсы диска.

Вот фрагмент кода, демонстрирующий, как это делается

const uuid = require("uuid-mongodb");
require("mongoose-uuid2")(mongoose);

let schema_options = {
    "id": false,
    "toObject": {
      "getters": true,
      "virtuals": true
    },
    "toJSON": {
      "getters": true,
      "virtuals": true,
      "transform"(doc, ret) {
        delete ret._id;
      }
    }   };

let schema = new Schema(
    {
      "_id": {
        "type": UUID,
        "default": uuid.v4,
        "required": true
      },
      "code": {
        "type": String,
        "required": true,
        "unique": true
      },
      "name": {
        "type": String,
        "required": true
      }
    },
    schema_options);

schema.virtual("id").get(function() {
   return uuid.from(this._id).toString();   
});

schema.virtual("id").set(function(uuid_string) {
  this._id = uuid.from(uuid_string);   
});

Однако, если я добавлю «ref» в другую коллекцию, как с

schema.add({
    "test_references": {
      "type": [
        {
          "type": mongoose.Types.UUID,
          "ref": "test_references"
        }
      ],
      "required": true
    }
  });

, я получу хэш-представление BSON UUID.Есть ли способ сделать MongooseJS во время операции get, чтобы показать эти ссылки в виде строковых представлений UUID

, т. Е. - я ожидаю это "104e0f2e-3b54-405b-ba81-e87c5eb9f263", но получу это "EE4PLjtUQFu6geh8XrnyYw =="

Примечание: : Если это неправильный форум для этого поста, пожалуйста, дайте мне знать, и я немедленно перенесу это на правильный форум

1 Ответ

0 голосов
/ 16 ноября 2018

После еще одного исследования я смог применить преобразование к возвращенному значению.

Это выглядит следующим образом:

this.schema.options.toJSON.transform = function(doc, ret, option) {
      let items = [];

      delete ret._id;
      ret.items.forEach((item) => {
        items.push(mongoose.uuid.from(item).toString());
      });
      ret.items = items;
      return ret;
    };

Не идеально просматривать все элементы в массиве, но это лучшее, что я мог найти в своем исследовании

...