美文网首页
Mongoose中的Document方法

Mongoose中的Document方法

作者: 似朝朝我心 | 来源:发表于2020-10-31 17:23 被阅读0次

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对象也可以操作数据库。

相关文章

网友评论

      本文标题:Mongoose中的Document方法

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