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

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() 时,这个数据中不合法的数据还是不会被保存到数据库。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值