Определение схемы Mongoose на лету из «описания» в формате JSON - PullRequest
6 голосов
/ 14 декабря 2011

Я создаю веб-приложение, которое позволяет пользователям создавать свои собственные коллекции MongoDB на моем сервере, сначала «зарегистрировав» схему в форме на стороне клиента.

Таким образом, пользователь создаст схемуна стороне клиента - скажем, используя такую ​​форму: http://r.github.com/annotationsformatter/

Таким образом, Js на стороне клиента сгенерирует объект JSON формы, например:

{
    "collection_name": "person",
    "data": 
    {
        "name": "String",
        "email": "String",
        "id", "Number",
    }
}

Далее, страницаотправит этот объект на сервер, который должен преобразовать материал из data в правильную схему Mongoose и создать из него коллекцию с именем коллекции person.

Я потерян - как бы яидти делать это?Я говорю о части преобразования в схему.

Ответы [ 3 ]

12 голосов
/ 02 декабря 2012

Я написал библиотеку node.js именно для этой цели: генерировать модели mongoose из .json файлов конфигурации.

Она называется mongoose-gen .Он поддерживает все типы мангустов, имеет хуки для валидаторов, сеттеров, геттеров и значений по умолчанию.

Надеюсь, это поможет.

11 голосов
/ 15 декабря 2011

Если я правильно понимаю цель, вы захотите зациклить каждое из этих определений поля в поле data в объекте JSON и преобразовать его в допустимое поле для схемы мангуста, сопоставив его с реальным типом. Поэтому вы можете начать с чего-то вроде этого:

var mongoose = require('mongoose')

var typeMappings  =
{"String":String, 
 "Number":Number,
 "Boolean":Boolean,
 "ObjectId":mongoose.Schema.ObjectId,
  //....etc
}

function makeSchema(jsonSchema){
  var outputSchemaDef = {}
  for(fieldName in jsonSchema.data){
    var fieldType = jsonSchema.data[fieldName]
    if(typeMappings[fieldType]){
      outputSchemaDef[fieldName] = typeMappings[fieldType]
    }else{
      console.error("invalid type specified:", fieldType)
    }
  }
  return new mongoose.Schema(outputSchemaDef)
}

Чтобы иметь дело со встроенными объектами и типами массивов, вы, вероятно, захотите изменить это, чтобы сделать его рекурсивным, и опускаться глубже, когда он встречает объект этих типов, поскольку поля могут быть вложены вместе с произвольной глубиной / структурой .

Надеюсь, это поможет.

0 голосов
/ 27 июня 2016

Я не знаю, рекомендуется ли делать это так, но мне просто нужен мой JSON-файл, а затем я просто удаляю свойство "name", созданное во время выполнения require.

var jsonSchema = require('schema.json');
delete jsonSchema.name;

var MySchema = new Schema(jsonSchema);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...