MongoDB的学习

MongoDB的学习

一、准备

新建一个文件夹,在控制台输入npm init -y来创建package.json的包,新建index.js作为我们的入口文件,再新建好toolsmodelscontroller三个文件夹,其中,tools是用于连接数据库的,controller用于书写接口的,而models用于创建数据库的一些模式对象函数

二、安装所需的包

在我们demo的终端输入:

npm i express --save
npm i mongoose --save

第一个用于创建服务器,第二个用于连接包

编写index.js的文件

// 引入包
const express = require('express')
// 创建实例
const app = express()
// 用于解析
app.use(express.urlencoded({extended:true}))
// 监听端口
app.listen(80, () => {
  console.log('打开了')
})

三、连接数据库创建模式对象

在我们的tools文件夹下创建index.js,如果怕搞混可以改成其他的名字,连接我们的数据库

// 引入
const mongoose = require('mongoose')
// 连接
mongoose.connect('mongodb://localhost/student') // 这个student是创建的数据库的名字
// 测试
mongoose.connection.once('open', () => {
  console.log('连接成功')
})
mongoose.connection.once('close', () => {
  console.log('连接断开----')
})

module.exports = mongoose

然后在models.js文件夹下创建index.js文件,用于创建模式对象

const mongoose = require('../tools/index.js')

// 创建Schema(模式)对象
const Schema = mongoose.Schema

const stuSchema = new Schema({
  uname: {
    type: String,
    default: '法外狂徒张三'
  },
  age: Number,
  sex: {
    type: String,
    default: 'boy'
  }
})

const stuModel = mongoose.model('stu', stuSchema)

const creat = (postData) => {
  return new stuModel(postData)
    .save()
    .then((res) => res)
    .catch((err) => {
      console.log('插入失败' + err)
      return false
    })
}
const list = (skip, pageSize) => {
  return stuModel
    .find()
    .skip(skip)
    .limit(pageSize)
    .then((res) => res)
    .catch((err) => {
      console.log('查询失败' + err)
      return []
    })
}
module.exports = {
  creat,
  list
}

四、书写简单的接口

在我们的controller文件夹下创建index.js文件,书写以下内容

const { creat, list } = require('../models/index.js')

const addStr = async (req, res) => {
  const postData = req.body
  console.log(postData)
  let rs = await creat(postData)
  if (rs) {
    res.send({
      meta: {
        state: 200,
        msg: '添加成功'
      },
      data: null
    })
    return
  }
  res.send({
    meta: {
      state: 500,
      msg: '添加失败'
    },
    data: null
  })
  return
}

const index = async (req, res) => {
  let getData = req.query
  let skip = (parseInt(getData.page) - 1) * parseInt(getData.pageSize)
  const data = await list(skip, getData.pageSize)
  res.send({
    mate: {
      state: 200,
      msg: '查询成功'
    },
    data
  })
}

module.exports = {
  addStr,
  index
}

五、使用

在入口文件下就可以书写接口了

const express = require('express')
const {addStr,index} = require('./controller/index.js')

const app = express()

app.use(express.urlencoded({extended:true}))

app.get('/', (req, res) => {
  res.send('hello')
})

app.post('/stu',addStr)
app.get('/stu',index)

app.listen(80, () => {
  console.log('打开了')
})

六、测试

在我们下载安装的目录mongoDb的文件夹下找到bin文件夹,进入文件夹,在地址栏输入cmd打开该文件夹的终端,在终端输入:

mongod --dbpath=..\data\db

来启动我们的数据库,如果配置环境变量可以直接输入mongod可以使用可视化的软件去连接数据库查看数据库的状态;然后在进入我们的demo下,输入node index.js来启动我们的服务器,使用postman或者Apipost来对我们写的接口进行一定的测试

七、拓展数据库操作

1、准备基本结构

准备一些基本的结构

// 引入
const mongoose = require('mongoose')
// 连接
mongoose.connect('mongodb://localhost/mongoose_test')
// 测试
mongoose.connection.once('open', () => {
  console.log('连接成功')
})
mongoose.connection.once('close', () => {
  console.log('连接断开----')
})

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

const stuModel = mongoose.model('student', stuSchema)

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

注意:其中的一些api已经废弃了,控制台也会警告该api已经废弃,可以使用其他的来代替,更多的api可以见官网文档:<Mongoose.js中文网 (mongoosejs.net)>

2、增

    -  Model.create(doc(s),[callback]) 
        - 用来创建一个或多个文档并添加到数据库中
        - 参数:
          - doc(s):可以是一个文档对象,也可以是一个文档对象的数组
          - callback:当我们操作完成以后的回调函数
              - 第一个参数为错误信息,第二个是插入的文档

举例子:

stuModel.create(
  [
    {
      name: 'tony',
      age: 22,
      gender: 'male',
      address: 'China'
    },
    {
      name: 'Marry',
      age: 18,
      address: 'UK'
    }
  ],
  (err) => {
    if (!err) {
      console.log('插入成功')
    }
  }
)

3、查

        Model.find(conditions,[projection],[options],[callback])
            - 查询所有符合条件的文档,返回的是一个数组
        Model.findById(id,[projection],[options],[callback])
            - 根据文档的id属性查询文档,返回的是一个对象,id是一个字符串
        Model.findOne([conditions],[projection],[options],[callback])
            - 查询符合条件的第一个文档,返回一个对象
          - 参数:
              - conditions:查询条件
              - projection:投影
                  - 传统方式:{ name: 1 }
                  - 字符串写法:'name -_id' 减号表式去除该选项
              - options:查询选项(skip,limit)
                  - { skip: 1 } 表式跳过第一个
                  - { limit: 2 } 只显示两个
              - callback:回调函数,查询的结果会通过回调函数返回
                  - 回调函数必传,如果不传,压根不会查询

举例:

stuModel.find({}, (err, docs) => {
  if (!err) {
    console.log(docs)
  }
})

stuModel.find({}, 'name -_id', { limit: 2 }, (err, docs) => {
  if (!err) {
    console.log(docs)
  }
})

4、改

          - Model.update(conditions,doc,[options],[callback])
          - Model.updateMany(conditions,doc,[options],[callback])
          - Model.updateOne(conditions,doc,[options],[callback])
                - 用来修改一个或多个文档
                - 参数:
                    - conditions:查询条件
                    - doc:修改后的对象
                    - options:配置参数
                    - callback:回调函数,查询的结果会通过回调函数返回
                          - 回调函数必传,如果不传,压根不会查询

举例:

stuModel.updateOne({ name: 'tony' }, { $set: { age: 48 } }, (err) => {
  if (!err) {
    console.log('修改成功')
  }
})

5、删

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

举例:

stuModel.remove({ name: 'Marry' }, (err) => {
  if (!err) {
    console.log('删除成功')
  }
})

6、查看同一文档数量

    - Model.count(conditions,[callback])

举例:

stuModel.count({}, (err, count) => {
  if (!err) {
    console.log(count)
  }
})
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值