MongoDB和Node

MongoDB和Node(一)

一, 连接

  1. 需要依赖Node.js第三方包mongoose

  2. 启动服务(同msql,SqlServer等): net start(stop) mongoDB

  3. 连接(创建)数据库:

    • ```JavaScript
      // 1.mongodb: 是芒果数据库的协议规则
      // 2.connect返回的是promise对象
      // 3.playgroud是数据库名称,没有则会新建,和创建文件一样
      const mongoose = require(‘mongoose’)
      mongoose.connect(‘mongodb://localhost/playgroud’)
      .then(()=>console.log('数据库连接成功'))
      .catch(err=>console.log('数据库连接失败',err))
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22

      ## 二,增删改查

      > 关于数据库的操作都是异步操作 异步api有回调函数和promise两种方式
      >
      > 前端里异步都可以用promise 这些方法都返回promise对象

      ### 1. 创建集合

      - 第一步:对集合设定规则(设置属性字段)

      - 第二步:使用规则创建集合

      ```JavaScript
      // 传入的对象就是集合属性(表字段)
      const couresSchema = new mongoose.Schema({
      name: String,
      author: String,
      isPublished: Boolean
      })
      // 返回的是构造函数,通过构造函数里的各种方法操作集合的数据
      const Course = mongoose.model('Course', couresSchema)

2. 创建文档

数据库没有数据就不会显示

_id是唯一标识

  • 创建集合实例

  • 调用实例对象下的save方法将数据保存到数据库中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // 方式一:方法调用生成
    // 实例化上面的构造函数
    const course = new Course({
    name: 'node',
    author: 'why',
    isPublished: true
    })
    course.save()

    // 方式二:通过构造函数方法初始化
    // 回调函数方式
    Course.create({name: '前端',author: 'pink',isPublished: false}, (err, res) => {
    console.log(err);
    console.log(res);
    })
    // promise方式
    Course.create({ name: '前端', author: 'pink', isPublished: false })
    .then(doc=>console.log(doc))
    .catch(err=>console.log(err))

3. 数据库导入数据

mongoimport -d 数据库名称 -c 集合名称 -file 要导入的数据文件

导入需要配置环境变量

4. 查询文档

find() 返回的是数组 findOne() 返回的是单个数据

1
2
3
4
5
6
7
8
9
10
11
const userSchema = new mongoose.Schema({
name: String,
age: Number,
hobbies: [String]
})
const User = mongoose.model('User', userSchema)
// 查询所有
User.find().then(res => console.log(res))
// 查询age为20
User.find({ age: 20 }).then(res => console.log(res))

$gt 大于 $lt 小于 $in 包含 条件查询也是通过对象参数的方式

1
2
3
4
// 查询年龄大于19小于23的用户数据
User.find({ age: { $gt: 19, $lt: 23 } }).then(res => console.log(res))
// 查询爱好包含唱歌的用户数据
User.find({ hobbies: { $in: ['唱歌'] } }).then(res => console.log(res))

查询多个字段

1
2
3
4
// 查询所有用户的姓名和年龄   默认带有id
User.find().select('age name').then(res => console.log(res))
// -字段 不查询此字段
User.find().select('age name -_id').then(res => console.log(res))

排序

1
2
3
4
// 将查询出的年龄按时间排序   (默认升序)
User.find().sort('age').then(res => console.log(res))
// 加 - 是降序
User.find().sort('- age').then(res => console.log(res))

skip跳过多少条数据,limit限制查询数量 (常用于分页)

1
2
// 跳过了前两条数据,只查询一条
User.find().skip(2).limit(1).then(res => console.log(res))

5. 删除文档

1
2
3
4
5
6
// 1. 删除单个
// 删除哪个就返回值就哪个 (匹配到多个,只会删除第一个)
User.findOneAndDelete({ name: 'devil' }).then(res => console.log(res))
// 2. 删除多个
// 不传值默认删除全部
User.deleteMany({}).then(res => console.log(res))

6. 更新文档

1
2
3
4
// 更新单个  {查询条件} , {要修改的值}  (匹配到多个,只会更新第一个)
User.updateOne({ name: 'lj' }, { age: 18 }).then(res => console.log(res))
// 更新多个文档 {} 不传参数就是全选
User.updateMany({}, { age: 18 }).then(res => console.log(res))