Как mon goose модель на основе схемы Dynami c, передаваемой в качестве параметра? - PullRequest
3 голосов
/ 13 февраля 2020

Я новичок в понедельник goose и для expressjs

Я хочу получить коллекцию на основе do c и модели. У меня есть несколько схем, которые наследуют общую схему.

const extendSchema = (schema: mongoose.Schema<any>, definition: any): Schema<any> => {
  return new mongoose.Schema({ ...schema.obj, ...definition, ...{ strict: false }});
};

const CommonSchema = new mongoose.Schema({ ... });

const OtherSchema = extendSchema(CommonSchema, { ... });

const OtherOtherSchema = extendSchema(CommonSchema, { ... });

Затем я хочу получить коллекцию из mon goose

const getCollectionObject = (collection: string, schema: Schema) => {
  return collection.model(collection, schema);
};


// get the first collection
export const getOtherCollection = async (name: string, id: string) => {
  try {
    const model = getCollectionObject(name, OtherSchema);
    const document = await model.findById(mongoose.Types.ObjectId(id)).lean();
    return document;
  } catch (error) {
    return error;
  }
};


// get the second collection
export const getOtherOtherCollection = async (name: string, id: string) => {
  try {
    const model = getCollectionObject(name, OtherOtherSchema);
    const document = await model.findById(mongoose.Types.ObjectId(id)).lean();
    return document;
  } catch (error) {
    return error;
  }
};

У меня ошибка ниже enter image description here

Возможно ли это? Заранее спасибо!

PS: я уже видел другие посты, решение которых состоит в том, чтобы сделать свойства необязательными.

1 Ответ

1 голос
/ 14 февраля 2020

Это решило мою проблему.

Создайте общую схему плюс другую схему

const CommonSchema = new mongoose.Schema({ ... });
const OtherSchema = { ... };
const OtherOtherSchema = { ... };

Затем я объявил свою основанную модель.

const Base = mongoose.model('collection-name', CommonSchema);

Далее, Я создал свои другие модели на основе базовой модели, используя дискриминатор

const OtherModel = Base.discriminator("Other", new mongoose.Schema(OtherSchema));
const OtherOtherModel = Base.discriminator("OtherOther", new mongoose.Schema(OtherOtherSchema));

Теперь вы можете использовать модель для любой функции с областью действия, вы можете экспортировать ее, если хотите.

Other.create({ ... });
Other.findById()

OtherOther.create();
OtherOther.findById();

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

Спасибо!

...