最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

如何添加动态架构在MongoDB中猫鼬

运维笔记admin11浏览0评论

如何添加动态架构在MongoDB中/猫鼬

如何添加动态架构在MongoDB中/猫鼬

我要创建用户定义的数据库,多数民众赞成,每个用户可以拥有自己的数据库的味道。所以我用strict: false但现在的问题是我不能让用户定义模式下,每个模式的type

Example

const mongoose = require('mongoose');

const testSchema = new mongoose.Schema({
    label: {
        required: 'please enter label',
        trim: true,
        type: String
    },
    url: {
        type: String,
        trim: true,
    },
    settings: {}  //User defined 
    }, {
        timestamps: true, strict: false
    });


module.exports = mongoose.model('test', testSchema);

在上述情况下,我要通过用户定义的设置等,

{
    "label": "About Us",
    "url": "www.google",
    "settings": { 
        "name": {
            "type": "String",   //Problem is Here, i can't send datatype directly
            "required": true
            },
        "age": {
            "type": "Number",
            "required": true,
            "enum": [10, 12]
        }
    }
}

所以,请告诉帮我,我怎么可以让用户定义的架构的类型?

回答如下:

strict: true并不意味着你可以通过任何东西settings领域。

这意味着你的模式格式是动态的 - 你可以在未在架构中定义文件意想不到的字段名。

回答你的问题:

好像你要子文档,让我们另一个模式并将其安装类型:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const types = Schema.Types;

const testSettingsSchema = new Schema({
  name: {
    type: types.String,
    required: true
  },
  age: {
    type: types.Number,
    required: true
    enum: [10, 12]
  }
},
{
  _id : false,
  timestamps: false, 
  strict: false
});

const testSchema = new Schema({
  label: {
    required: 'please enter label',
    trim: true,
    type: types.String
  },
  url: {
    type: types.String,
    trim: true,
  },
  settings: {
    type: testSettingsSchema,
    required: true
  }
}, 
{
  timestamps: true, 
  strict: true
});


module.exports = mongoose.model('test', testSchema);

但要获得更大的灵活性,避免造成大test文件(因为用户可以推动不可预知的大对象),创建另一个模式:testSettings指向test_settings收集并settings字段设置为参考:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const types = Schema.Types;

const testSettingsSchema = new Schema({
  name: {
    type: types.Mixed
  },
  age: {
    type: types.Mixed
  }
},
{
  collection: 'test_settings',
  timestamps: false, 
  strict: false // tells to mongoose that schema may "grow"
});
mongoose.model('testSettings', testSettingsSchema);

const testSchema = new Schema({
  label: {
    required: 'please enter label',
    trim: true,
    type: types.String
  },
  url: {
    type: types.String,
    trim: true,
  },
  settings: {
    type: types.ObjectId,
    ref: 'testSettings'
    default: null
  }
}, 
{
  collection: 'tests',
  timestamps: true, 
  strict: true
});


module.exports = mongoose.model('test', testSchema);

创建为:

const Test = mongoose.model('test');
const TestSettings = mongoose.model('testSettings');

app.post('/tests', async (req, res) => {
  try {
    const testSettings = await TestSettings.create(req.body.settings);

    const test = new Test(req.body);
    test.settings = testSettings._id;
    await test.save();

    res.status(201).send({_id: test._id});
  }
  catch(error) {
    res.status(500).send({message: error.message});
  }
});

并根据要求及时得到它:

const Test = mongoose.model('test');

app.get('/tests/:id', async (req, res) => {
  try {
    const test = await Test.findById(req.params.id)
                           .populate('settings')
                           .lean();
    res.status(200).send(test);
  }
  catch(error) {
    res.status(500).send({message: error.message});
  }
});
发布评论

评论列表(0)

  1. 暂无评论