使用MongooseJS将Mongodb _id更改为BSON UUID作为参考

时间:2018-11-16 13:35:17

标签: node.js mongodb mongoose mongoose-schema ref

我目前使用MongooseJS将每个集合的“ _id”更改为BSON UUID。在此之上,我使用一个虚拟的“ id”将“ _id”转换为等效的字符串。它工作得很好,并为我带来了为“ _id”使用UUID的好处,而不是将其存储为浪费磁盘资源的字符串。

下面是一段代码,展示了如何完成

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以将这些引用显示为UUID字符串表示形式

即-我希望这是“ 104e0f2e-3b54-405b-ba81-e87c5eb9f263”,但会收到此“ EE4PLjtUQFu6geh8XrnyYw ==“

注意::如果这是此帖子的错误论坛,请告诉我,我会立即将其移至正确的论坛

1 个答案:

答案 0 :(得分:0)

经过更多研究,我能够对返回值应用转换。

如下所示:

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;
    };

浏览数组中的所有项并不理想,但这是我在研究中能找到的最好的