mongoose中如何给数据添加对应schema中没有的字段

来源:互联网 发布:如何升级mac os 编辑:程序博客网 时间:2024/06/06 23:08

mongoose中如何给数据添加对应schema中没有的字段

文中js代码用的标准是ECMA6

问题解释:

当使用mongoose驱动数据库时,假如我们有这样的Schema

var mongoose = require("mongoose");var Schema = mongoose.Schema;var UserSchema = new Schema({    name: String,    gender: Boolean});mongoose.model("User", UserSchema);mongoose.connect("mongodb://mongo服务器IP:27017/数据库名");var db = mongoose.connection;db.once("open", function () {    console.log("Mongo Connected");});db.on("error", console.error.bind(console, "Mongoose Connection Error"));

插入一条实验数据

var User = mongoose.model("User");var user = new User({    name: "test",    gender: true});yield user.save();

那么当我们查询User表获取到数据后这样操作时

var user = yield User.findOne({name: test});console.log(user);//{ _id: ObjectId("……"), name: "test", gender: true }user.name = "test1";user.school = "华南理工大学";console.log(user);//{ _id: ObjectId("……"), name: "test1", gender: true }yield user.save();

可以看到,Schema中定义了的name被修改成功,但是school字段添加不成功,这正是mongoose的优点,对于不符合Schema的字段的操作是不起作用的,但同时造成了一定的局限性。比如当查询出来的User有不同的属性,他可能是管理员,黑名单成员,这时候我们需要给他添加一个category字段来表示他的类型再返回给前端,但是数据库表中并不需要这个字段,因为他储存在不同的表中,这时候我们要怎么才能给他加字段然后返回呢?

下面给大家晒晒我的解决路线:

首先我思考了一下mongoose是怎样实现这样的效果的,我的猜想是用mongoose对数据进行了封装,当我们对user这个对象进行扩展或者修改时它会先检查扩展或修改后是否符合Schema规范,如果不符合,则操作不生效,如果符合,则操作生效。假如这个猜想是正确的,那么user这个对象一定有一个用来储存数据属性并且这个属性是可以随意修改的。于是我将user的所有键值打印了出来:

var _ = require("underscore");console.log(_.keys(user));//[ '$__', 'isNew', 'errors', '_doc', '$__original_save', 'save', '_pres', '_posts' ]

从打印出来的键值名不难看出_doc应该就是用来储存数据的,打印一下:

console.log(user._doc);//{ _id: ObjectId("……"), name: "test1", gender: true }

接下来试一下能否对这个对象进行不符合Schema的操作:

console.log(user._doc);//{ _id: ObjectId("……"), name: "test1", gender: true }user._doc.school = "华南理工大学";console.log(user._doc);//{ _id: ObjectId("……"), name: "test1", gender: true, school: "华南理工大学" }

事实证明我的猜想是正确的,nice!

总结:当我们想对mongoose数据进行不符合schema的修改又不想修改schema时,可以直接修改data._doc, 当然在你调用data.save() 时,这个数据中不合法的数据还是不会被保存到数据库。

0 0