美文网首页
Mongoose 动态给 Schema 添加属性

Mongoose 动态给 Schema 添加属性

作者: 般犀 | 来源:发表于2019-03-28 14:45 被阅读0次

今天做项目的时候有个需求,需要在数据库里动态添加属性(虽然不确定这样是不是好的)。
发现 MongoDB 无法动态添加。但是我在我的 egg 项目里是可以的,应该是 egg-mongoose 内置做了什么。这也表示 MongoDB 是允许动态添加属性的。

1. 使用 Schema.prototype.add()

看了官方文档,官网给的方法是,实例化 Schema 后,先使用 Schema.prototype.add()添加属性,再调用 mongoose.model 编译出 model:

const ToySchema = new Schema();
ToySchema.add({ name: 'string', color: 'string', price: 'number' });

const TurboManSchema = new Schema();
// You can also `add()` another schema and copy over all paths, virtuals,
// getters, setters, indexes, methods, and statics.
TurboManSchema.add(ToySchema).add({ year: Number });

但是按照我的习惯,会直接在实例化 Schema 后在后面直接用mongoose.model直接编译出 model。这样在给 model 创建方法的时候也比较方便。

2. 设置 Schema 的 strict

这是我使用的方法。mogoose默认 strict 为 true,就不允许添加 Schema 中未定义的属性,将 strict 设为 false 就可以。但是风险就是如果用户使用了 Schema 中已经定义的属性,那原来那个属性就有被覆盖的风险:

// code from : https://github.com/Automattic/mongoose/issues/1867#issuecomment-38652088

 var thingSchema = new Schema({..}, { strict: false });
 var thing = new Thing({ iAmNotInTheSchema: true });
thing.save() // iAmNotInTheSchema is now saved to the db!!

3. 使用 Mixed types

按照我的理解,Mixed types 就是不具体定义 mongoose 有什么属性了,直接使用 any表示 Schema 里可以有任意多个属性,且不限定数据结构。这样又太泛了,对其他的属性没有约束:

const Any = new Schema({ any: {} });
const Any = new Schema({ any: Object });
const Any = new Schema({ any: Schema.Types.Mixed });
const Any = new Schema({ any: mongoose.Mixed });
// Note that if you're using `type`, putting _any_ POJO as the `type` will
// make the path mixed.
const Any = new Schema({
  any: {
    type: { foo: String }
  }
});

以上就是 Mongoose 动态给 Schema 添加属性的方法。

参考资料:
Dynamically adding fields in the schema doesn't permit to add fields as usual #1867

Schemas

相关文章

  • Mongoose 动态给 Schema 添加属性

    今天做项目的时候有个需求,需要在数据库里动态添加属性(虽然不确定这样是不是好的)。发现 MongoDB 无法动态添...

  • 动态添加属性

    动态添加属性:什么时候需要动态添加属性? 开发场景:给系统的类添加属性的时候,可以使用runtime动态添加属性方...

  • 2019-11-07

    ``` let schema = mongoose.Schema({ name: {type: String, ...

  • runtime相关

    修改系统方法 动态添加方法 动态给系统类添加属性(给分类添加属性) runtime+kvc 转换模型

  • mongoose创建唯一索引

    有如下Schemavar Schema = new mongoose.Schema({category : Str...

  • react 对象动态添加属性 setState

    // js 对象动态添加 js对象动态添加 //总结,给对象动态添加变量属性的方法如下: //obj[变量]=变...

  • Mongoose-使用node.js操作数据库

    Mongoose就是对象文档模型(ODM) 1.Mongoose的对象 Mongoose有3个对象:Schema(...

  • runtime简单使用之动态添加属性

    runtime简单使用之给系统类动态添加属性 前言 1, 给类动态添加属性,实质就是让一个属性与某个对象产生关联的...

  • 二十一:Python之动态添加属性方法

    一:动态添加属性方法 动态添加属性:类属性,成员属性 动态添加方法:成员方法,类方法,静态方法 动态添加对象方法需...

  • mongoose 使用

    mongoose 使用 Mongoose 基础使用 Connect 链接数据库 定义文档模型, Schema 和 ...

网友评论

      本文标题:Mongoose 动态给 Schema 添加属性

      本文链接:https://www.haomeiwen.com/subject/eavqbqtx.html