Мангуст: как переопределить схему программно? - PullRequest
1 голос
/ 10 мая 2019

У меня есть много отдельных схем Mongoose, ссылающихся друг на друга с помощью ObjecId s. Исходя из этого, теперь я хочу составить еще один программно.

Я пробовал что-то вроде следующего:

const Offers = require('../offers/offersModel')
const Stores = require('../stores/storesModel')

const flattenedStores = Stores.schema
const flattenedOffers = Offers.schema

// this step is not working as I expected
flattenedOffers.paths.storeId = flattenedStores 

const FeedsSchema = new Schema({ 
    offerId: flattenedOffers,
    // ...other fields
})

Первоначально, в модели предложений, storeId - это ObjectId, ссылающийся на модель магазинов:

OffersSchema = new Schema({
    storeId : {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Stores',
        required: true
    },
    // ...other fields
})
module.exports = mongoose.model('Offers', OffersSchema)

Я хотел программно изменить его на схему sub flat flatStores. Но это не сработало. Как это сделать?

Этот пример прост, и я действительно мог бы просто вставить всю схему вручную в FeedsSchema. Однако в моем реальном случае использования существует длинная цепочка схем, каждая из которых содержит много полей, где только одно поле является ссылкой на другую схему.

Я бы предпочел переопределить только эти отдельные ссылки, а не вводить всю структуру вручную в FeedsSchema ... Возможно ли это?

1 Ответ

1 голос
/ 11 мая 2019

Итак, я нашел способ ... отделить поля объекта схемы от созданной схемы:

const OffersSchemaObj = {
    storeId : {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Stores',
        required: true
    },
    // ...other fields
}
OffersSchema = new Schema(OffersSchemaObj)
exports.model = mongoose.model('Offers', OffersSchema)
exports.schema = OffersSchemaObj

Тогда я могу использовать объект схемы и изменять все, что захочу:

const OffersSchema = require('../offers/offersModel').schema
const StoresSchema = require('../stores/storesModel').schema

OffersSchema.storeId = StoresSchema

const FeedsSchema = new Schema({ 
    offerId: OffersSchema,
    // ...other fields
})
...