在nodejs中使用mongoose

Mongoose简介

简介

  • 之前我们都是通过shell来完成对数据库的各种操作的,在开发中大部分时候我们都需要通过程序来完成对数据库的操作
  • 而Mongoose就是一个让我们可以通过Node来操作MongoDB的模块
  • Mongoose是一个对象文档模型(ODM)库,它对Node原生的MongoDB模块进行了进一步的优化封装,并提供了更多的功能
  • 在大多数情况下,它被用来吧结构化的模式应用到一个MongoDB集合,并提供了验证和类型转换等好处

Mongoose的好处

  • 可以为文档创建一个模式结构(Schema)
  • 可以对模型中的对象/文档进行验证
  • 数据可以通过类型转换为对象模型
  • 可以使用中间件来应用业务逻辑挂钩
  • 比Node原生的MongoDB驱动更容易

新的对象概念

  • mongoose中为我们提供了几个新的对象

    • Schema(模式对象)
    • Schema对象定义约束了数据库中的文档结构
    • Model
    • Model对象作为集合中的所有文档的表示,相当于MongoDB数据库中的集合collection
    • Document
    • Document表示集合中的具体文档,相当于集合中的一个具体的文档

    基本使用

    /**
     * 1. 下载安装 Mongoose
     *      npm i mongoose --save
     * 2. 在项目中引入mongoose
     *      var mongoose = require("mongoose")
     * 3. 连接MongoDB数据库
     *      mongoose.connect('mongodb://localhost/test');
     *      mongoose.connect('mongodb://数据库的ip地址:端口号/数据库名');
     *          - 如果端口号是默认的端口号(27017) 则可以省略不写
     * 4. 断开数据库连接(一般不需要调用)
     *      mongoose.disconnect()
     *
     * 
     * 5. 监听MongoDB数据库的连接状态
     *      -  在mongoose对象中,有一个属性叫做connection,该对象表示的就是数据库连接
     *          通过监视该对象的状态,可以来监听数据库的连接和断开
     *
     *          mongoose.connection.once("open",function(){});  // 数据库连接成功事件
     *          mongoose.connection.once("close",function(){})  // 数据库断开的事件
     */

连接数据库

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/test');

mongoose.connection.once("open",function(){
    console.log('数据库连接成功');
});

创建Schema对象

var Schema = mongoose.Schema;

// 创建Schema(模式)对象
var stuSchema = new Schema({
    name: String,
    age: Number,
    gender: {
        type: String,
        default: "female"
    },
    address: String
})

创建模型

// 通过Schema来创建Model
// Model代表的是数据库中的集合,通过Model才能对数据库进行操作
// mongoose.model(modelName,schema) (集合名,Schema)
// modelName 就是要映射的集合名,mongoose会自动将集合名变成复数

var StuSchema = mongoose.model("student",stuSchema)

// 向数据库中插入一个文档
// StuSchema.create(doc,function(){})
StuSchema.create({
    name: "孙悟空",
    age: 34,
    gender: "male",
    address: "花果山"
},function(err){
    if(!err){
        console.log("插入成功")
    }
})

Model对象的常用方法

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

插入数据

Model.create(doc(s),[callback])
- 用来创建一个或多个文档并添加到数据库中
- 参数:
    doc(s) 可以是一个文档对象,也可以是一个文档对象的数据
    callback 当操作完成之后调用的回调函数

StuSchema.create([
    {
        name: "猪八戒",
        age: 22,
        gender: "male",
        address: "高老庄"
    },{
        name: "唐僧",
        age: 76,
        gender: "male",
        address: "女儿国"
    }
    ],function(err){
        if(!err){
            console.log('数据插入成功'+arguments)
        }
})

查询数据

Model.find(conditions,[projection],[options],[callback])
    - 查询所有符合条件的文档, 总会返回一个数组
Model.findById(id,[projection],[options],[callback])
    - 根据文档的id属性查询文档
Model.findOne([conditions],[projection],[options],[callback])
    - 查询符合条件的第一个文档,总是返回一个具体的文档对象,可以.

    conditions 查询条件
    projection 投影 需要获取到的字段
        - 两种方式
            {name: 1, _id: 0}
            "name -_id"
    options 查询选项(skip limit)
        {skip: 3, limit: 1}
    callback 回调函数,查询结果会通过回调函数返回
                回调函数必须传,如果不传回电函数,压根不会查询
# 查询出name,不包括_id的选项
StuSchema.find({name: '唐僧'},{name: 1, _id: 0},function(err,docs){
    if(!err){
        console.log(docs)
    }
})
# 查询出name age,不包括_id的选项
StuSchema.find({name: '唐僧'},"name age -_id",function(err,docs){
    if(!err){
        console.log(docs)
    }
})
# 跳跃2条,显示2条
StuSchema.find({name: '唐僧'},"name age -_id",{skip: 2, limit: 2},function(err,docs){
    if(!err){
        console.log(docs)
    }
})

StuSchema.findOne({},function(err,doc){
    if(!err){
        console.log(doc.name)
    }
})

StuSchema.findById("5b756524130fb82c541ff01b",function(err,doc){
    if(!err){
        console.log(doc)
        # 通过find()查询的结果,返回的对象,就是Document,文档对象
        # document对象是Model的实例
        # console.log(doc instanceof StuModel)
    }
})

修改数据

Model.update(conditions,[projection],[options],[callback])
Model.updateMany(conditions,doc,[options],[callback])
Model.updateOne(conditions,doc,[options],[callback])
    - 用来修改一个或多个文档
    - 参数
        conditions 查询条件
        doc 修改后的对象
        options 配置参数
        callback 回调函数

StuSchema.updateOne({name: "唐僧"},{$set: {age: 0}},function(err,docs){
    if(!err){
        console.log("修改成功")
    }
})

删除数据:

Model.remove(conditions,[callback])
Model.deleteOne(conditions,[callback])
Model.deleteMany(conditions,[callback])

StuModel.remove({name: "白骨精"},function(err){
   if(!err){
        console.log("修改成功")
    } 
})

统计文档的数量

Model.count(conditions,[callback])

StuModel.count({},function(count){
   if(!err){
        console.log(count)
    } 
})

document的使用

插入:

var StuSchema = mongoose.model("student",stuSchema)
// 创建一个Document
var stu = new StuSchema({
    name: "天霸",
    age: 23,
    gender: "male",
    address: "碧波庭"
})

// document的方法:
//      Model#save([options],[fn])
stu.save(function(err){
    if(!err){
        console.log("保存成功")
    }
})

修改

StuSchema.findOne({},function(err,doc){
    if(!err){
        // update(update,[options],[callback])
        //  - 修改对象
        // remove([callback])
        //   - 删除对象
        // console.log(doc)

        /* doc.update({$set: {age: 11}},function(err){
            if(!err){
                console.log("修改成功")
            }
        }) */

       /* doc.age = 22;
        doc.save(); */

       /* doc.remove(function(err){
            if(!err){
                console.log("删除成功")
            }
        }) */

        /*
            get(name)
                - 获取文档中的指定的属性值
            set(name,value)
                - 设置文档的指定的属性值
            id
                - 获取文档的_id的属性值
            toJSON()
                - 转换为一个JSON对象
            toObject()
                - 将document对象转换为一个普通的JS对象
                - 所有的document对象的属性和方法都不能使用了
        */
        // console.log(doc.get("age"))
        // console.log(doc.age)

        // doc.set("name","朱晓晓")
        // doc.name = "hahah"

        // console.log(doc._id)

        // var doc = doc.toObject();

        // delete doc.address 临时删除,并不会删除数据库中的数据
    }
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值