将多个猫鼬模型重构为类似的集合

Refactoring several mongoose models to similar collections

我有几个文档类型相同的集合,但语言不同。 比方说 imagesES、imagesEN、imagesFR 等等....

我只是想定义一个模式,还有一个模型,它通过参数获得正确的集合:

var mongoose = require('mongoose')
var Schema = mongoose.Schema
let authorSchema = require('./Authors').authorSchema

const  imageSchema = new Schema({
  authors: [authorSchema],
  status: Number, // published (1), unpublished (0)
  created: { type: Date, default: Date.now },
  lastUpdated: { type: Date, default: Date.now },
  license: {
    type: String,
    enum: ['Creative Commons BY-NC-SA'], //just one license right now
    default: 'Creative Commons BY-NC-SA'
  },
  downloads: {
    type: Number,
    default: 0
  },
  tags: [String]
})

module.exports = locale => {
  return mongoose.model('Image', imageSchema, `image${locale}`)
} 

但是在控制器中我应该需要控制器内部的模型(当我知道语言环境时):

  getImageById: (req, res) => {
    const id = req.swagger.params.id.value
    const locale = req.swagger.params.locale.value
    const Images = require('../models/Images')(locale)
    Images.findOne({_id: id}).lean().exec( (err, image) => {

我不确定这是否是正确的方法,因为我收到的每个请求都必须(同步地)要求模型模块,或者我是否应该在函数中使用之前要求所有不同的模型。

const locales = ['es', 'en', 'fr']
const Images = []
locales.map(locale=>Images[locale] = require('../models/Images')(locale))

  getImageById: (req, res) => {
    const id = req.swagger.params.id.value
    const locale = req.swagger.params.locale.value
    Images[locale].findOne({_id: id}).lean().exec( (err, image) => {

最后我就是这样解决的。上面写着象形图的地方,可能是问题中的图片

const setPictogramModel = require('../models/Pictograms')
const languages = [
  'ar',
  'bg',
  'en',
  'es',
  'pl',
  'ro',
  'ru',
  'zh'
]
const Pictograms = languages.reduce((dict, language)=> {
  dict[language]= setPictogramModel(language)
  return dict
}, {})

module.exports = {
  getPictogramById: (req, res) => {
    const id = req.swagger.params.idPictogram.value
    const locale = req.swagger.params.locale.value
    // Use lean to get a plain JS object to modify it, instead of a full model instance
    Pictograms[locale].findOne({id_image: id}).exec( (err, pictogram) => {
      if(err) {
        return res.status(500).json({
          message: 'Error getting pictograms. See error field for detail',
          error: err
        })
      }
      if(!pictogram) {
        return res.status(404).json( {
          message: `Error getting pictogram with id ${id}`,
          err
        })
      }
      return res.json(pictogram)
    })
  },