Mongoose中的Document对象和MongoDB数据库集合中的文档一一对应,上一章我们得知,Document是Model的实例,通过Model查询的结果都是Document.
所以我们是可以凭空创建一个Document,而不是再使用Model的方法来增删改查文档。
首先准备前面依赖的部分。
const mongoose = require('mongoose')
const Schema = mongoose.Schema
mongoose.connect('mongodb://127.0.0.1:27017/mytest', {useNewUrlParser: true, useUnifiedTopology: true})
mongoose.connection.once("open", () => {
console.log(`数据库已连接成功,Server is running at:http://127.0.0.1:27017`)
})
//创建一个Schema对象
const stuSchema = new Schema({
name: String,
age: Number,
gender: {
type: String,
default: "female"
},
address: String
});
//创建一个Model对象
const stuModel = mongoose.model('students', stuSchema);
创建一个Document,创建完成后,并不会立即生效插入到数据库当中。
const stu = new stuModel({
name: "小雪",
age: 21,
gender: "female",
address: "日月湾"
})
console.log(stu)

想要上面的代码生效,插入到数据库当中,需要额外执行Document的save()方法。
Model#save([options], [fn])
stu.save(err => {
if (!err) {//如果没有报错
console.log('保存成功!')
}
})
用Node执行代码

打开数据库的可视化工具,查看,发现数据保存成功。

Document对象其余常见方法(有些已经被废弃掉,自己斟酌使用)。

updateOne(update, [options], [callback])
比如我们想修改小红的年龄。

代码如下:
stuModel.findOne({name: "小红"}, (err, doc) => {
if (!err) {
doc.updateOne({$set: {age: 28}}, err => {
if (!err) {
console.log('修改成功')
}
})
}
})
执行代码:

查看数据库。

还有一种更加直接的改法。
stuModel.findOne({name: "小红"}, (err, doc) => {
if (!err) {
doc.age = 18
doc.save()
console.log('数据保存成功!')
}
})
实现的效果是一样的。

deleteOne( [callback])方法
我们删除小红的数据。
stuModel.findOne({name: "小红"}, (err, doc) => {
if (!err) {
doc.deleteOne(err => {
if (!err) {
console.log("小红再见!")
}
})
}
})
执行代码。

查看数据库,发现已经没有小红的数据了。

get(name)方法。
- 获取文档中指定的属性值。
stuModel.findOne({name: "小夏"}, (err, doc) => {
if (!err) {
console.log(doc.get("age"))
//等同于下面这个法子
console.log(doc.age)
}
})

set(name, value)
- 设置文档的属性值。
stuModel.findOne({name: "小夏"}, (err, doc) => {
if (!err) {
doc.set('name', '宋知夏')
//上面这行代码等同于doc.name = "宋知夏"
console.log(doc)
}
})

因为我们没有调用save()方法,所以数据库不会进行对应的更新操作。
获取id或_id值。
stuModel.findOne({name: "小夏"}, (err, doc) => {
if (!err) {
console.log(doc.id)
//等同于console.log(doc._id)
}
})

toJSON()方法
- 转换成一个json对象。
toObject()方法
- 将Document对象转换成一个普通的JS对象。
- 转换为普通的js对象以后,意味着所有的Document对象的方法或者属性都不能使用了,不能操作数据库了
stuModel.findOne({name: "小夏"}, (err, doc) => {
if (!err) {
console.log(doc.toObject())
}
})

既然如此,为什么需要使用toObject()方法呢?哪些场合下会使用到toObject()方法呢?比如涉及我们管理员的权限问题,数据的隐私保密程度,比如我是管理员,不希望别人找到小夏个人的隐私地址。这时候,就应用到了toObject()方法了。
stuModel.findOne({name: "小夏"}, (err, doc) => {
if (!err) {
doc = doc.toObject()
delete doc.address
console.log(doc)
}
})
我们发现查询不到小红夏的地址了。

总结:Document对象可以操作数据库,Model对象也可以操作数据库。

网友评论