美文网首页
Mongoose中常用的Model方法。

Mongoose中常用的Model方法。

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

    准备工作,创建Schema约束对象和连接数据库。

    //这里没有使用es6的import导入语法,因为没准备好环境,所以用了Node的require。
    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
      });
    const stuModel = mongoose.model('students', stuSchema);
    

    有了Model,我们就可以对数据库进行增删改查的操作了。

    create()方法,创建文档。

    Model.create(doc(s),[callback])

    • 含义:用来创建一个或者多个文档并添加到数据库当中。
    • 参数:
      第一个参数doc(s) ,后面的s代表是复数多个的意思,证明这个位置可以传一个文档对象,也可以传多个文档对象的数组。
      第二个参数[callback],这个位置返回的是一个回调函数,当操作完成后,调用该函数。
    • create方法模板:
    stuModel.create([], err => {
        if (!err) {
            console.log("文档插入成功")
        }
    })
    
    • 如果安装了脚手架或者有babel转译环境,可以使用ES6语法,添加一个await关键字,await后面接表达式。
    await stuModel.create([], err => {
        if (!err) {
            console.log("文档插入成功")
        }
    })
    
    • 在[]填充我们的文档对象。
    stuModel.create([
        {
            name: "小明",
            age: 22,
            gender: "male",
            address: "广东深圳"
        },
        {
            name: "小红",
            age: 20,
            gender: "female",
            address: "广东东莞"
        }
    ], err => {
        if (!err) {
            console.log("文档插入成功")
        }
    })
    
    • 通过node环境运行我们的js代码。


    • 打开数据库可视化工具查看数据有没有插入成功。


    find()方法,查询文档。

    Model.find(conditions, [projection], [options], [callback])

    • 查询所有符合条件的文档,总会返回一个数组。
    • 参数:
      第一个参数conditions:查询的条件。
      第二个参数[projection]:投影,需要获取到的字段,即你想要显示多少个字段,是全部显示呢?还是过滤掉一些字段(属性)。
      第三个参数[options]: 查询的选项(例如常用的skip和limit)。
      第四个参数[callback](必选): 回调函数,查询结果会通过回调函数返回,如果不传回调函数,压根不会查询。
    • find方法模板。
    stuModel.find({name: "小红"}, (err, docs) => {
        if (!err) {
            console.log(docs)
        }
    })
    
    • node环境运行代码。


    • 如果我们向访问具体的属性值,可以通过数组索引值访问。



    • 如果第一个参数的查询条件为一个空对象(什么都不指定),即默认查询所有文档。



    • 第二个参数[projection]的使用,规定显示要查询的字段(属性),将其他的字段过滤掉,它有2种传递方式,一种是传统的对象形式传递,另一种是字符串传递形式。

    比如我们下面的这个例子(使用对象形式传递),只想显示_id属性字段和age属性字段,其他的通通过滤掉。



    node环境执行代码,查看。


    • 第二个参数[projection]的使用不一定需要写成对象的形式,它还可以使用字符串的写法。



      我们发现,使用字符串的写法,无论_id属性到底有没有指定,最终它它都会默认指定(这个和MongoDB原理有个),但是我们真的想过滤掉_id属性呢?这个也是有法子的,_id属性前面添加一个减号即可去除默认指定。


    • 第三个参数[options]: 查询选项的使用。



      这样一看,好像看不出有什么效果。我们需要通过可视化工具打开我们的数据库查看一下,第三个参数到底要表达什么意思。


    Model.findOne(conditions, [projection], [options], [callback])

    • 查询符合条件的第一个(首个)文档,总会返回一个具体的文档对象,所以我们可以使用对象的形式获取属性值。
    • findOne方法模板。
    stuModel.findOne({}, (err, doc) => {
        if (!err) {
            console.log(doc)
        }
    })
    
    • findOne方法返回的是一个对象,find()方法返回的是一个数组。


    Model.findById(id, [options], [callback])

    • 根据文档的_id属性查询文档。
    • findById()方法模板。
    stuModel.findById("5f9cf5e1fca4ed20a4b81663", (err, doc) => {
        if (!err) {
            console.log(doc)
        }
    })
    
    • 找到对应的_id,原来是小明的。



    小结:通过find()查询的结果,返回的对象就是Document,即文档对象,所以我们可得出一个结论,Document对象是Model的实例,为了验证我们的结论,可以使用instanceof方法来判断一下,而typeof 是判断参数是什么类型的实例。

    update()方法,修改文档。

    Model.update(conditions, doc, [options], [callback])

    • 用来修改一个或者多个文档。
    • 参数:
      conditions:查询条件
      doc: 修改后的文档对象
      options: 配置参数选项
      callback: 回调函数

    Model.updateOne(conditions, doc, [options], [callback])

    • 用来修改一个文档。
    • 代码如下:


    • 打开数据库查看


    Model.updateMany(conditions, doc, [options], [callback])

    • 用来修改多个文档。

    Model.replaceOne(conditions, doc, [options], [callback])

    • 用来替换一个文档。

    remove()和delete()方法,删除文档。

    以下方法大同小异

    Model.remove(conditions, [callback])

    stuModel.remove({name: "小白"}, (err, doc) => {
        if (!err) {
            console.log('文档删除成功')
        }
    })
    
    • 测试了下,remove方法已经被deprecated(废弃)了,不过还是可以用的,官方建议我们使用delete()方法。


    • 查看一下,名字叫小白的文档已经被删除了。


    Model.deleteOne(conditions, [callback])

    Model.deleteMany(conditions, [callback])

    count()方法,统计文档数量。

    Model.count(conditions, [callback])

    • 好吧!count()方法又被废弃了,虽然效果可以实现,返回结果:5个。

    我们尝试使用官网推荐的方法.

    Model.countDocuments(conditions, [callback])

    stuModel.countDocuments({}, (err, count) => {
        if (!err) {
            console.log(count)
        }
    })
    

    Model.estimatedDocumentCount(conditions, [callback])

    stuModel.estimatedDocumentCount({}, (err, count) => {
        if (!err) {
            console.log(count)
        }
    })
    

    附:官网Model具体方法链接:https://mongoosejs.com/docs/api/model.html

    相关文章

      网友评论

          本文标题:Mongoose中常用的Model方法。

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