Mongoose 动态给 Schema 添加属性
在这里总结下如何使用NodeJs在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 });
1
2
3
4
5
6
2
3
4
5
6
但是按照我的习惯,会直接在实例化 Schema 后在后面直接用mongoose.model直接编译出 model。这样在给 model 创建方法的时候也比较方便。
# 2、设置 Schema 的 strict
这是我使用的方法。mogoose默认 strict 为 true,就不允许添加 Schema 中未定义的属性,将 strict 设为 false 就可以。但是风险就是如果用户使用了 Schema 中已经定义的属性,那原来那个属性就有被覆盖的风险:
let thingSchema = new Schema({..}, { strict: false });
let thing = new Thing({ iAmNotInTheSchema: true });
thing.save() // iAmNotInTheSchema is now saved to the db!!
1
2
3
2
3
# 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 }
}
});
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
以上就是 Mongoose 动态给 Schema 添加属性的方法。
上次更新: 2024/01/30, 00:35:17
- 01
- Node与GLIBC_2.27不兼容解决方案08-19
- 02
- Git清空本地文件跟踪缓存08-13