7.MongoDB

292 阅读3分钟

介绍

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

安装

MongoDB安装以及配置教程

MongoDB的基本使用

下载依赖

cnpm i mongodb -S 基本使用

//引入
const MongoClient = require('mongodb').MongoClient;

(async function () {
    //获取 client
    const client = new MongoClient('mongodb://localhost:27017', {
        useNewUrlParser: true /*用新的url解析器解析*/
    });
    //连接服务端
    await client.connect();
    console.log('连接成功');
    //获取数据库
    const db = client.db('luffycity');
    //获取集合
    const grades = db.collection('grades');
    //先删除所有的数据
    grades.deleteMany();
    //插入一条数据 使用 insertOne()
    grades.insertOne({
        name: 'holo',
        age: 20,
        hobby: ['吃饭', '睡觉', '打豆豆'],
        score: 86
    });
    //关闭连接
    client.close();
})()

插入多条数据使用insertMany()

    //插入多条数据
    //返回一个 promise
    let res = await grades.insertMany([{
        name: 'tom',
        age: 18,
        hobby: ['抓老鼠', '睡觉', '打豆豆'],
        score: 91
    }, {
        name: 'jerry',
        age: 17,
        hobby: ['逗猫', '睡觉', '打豆豆'],
        score: 88
    }])
    console.log('插入成功', res);

返回的res

可以通过res.result.ok来判断是否插入成功,res.result.n是插入的条数.

    //返回的 res
    {
  	result: { ok: 1, n: 2 },
  	ops: [
          {
            name: 'tom',
            age: 18,
            hobby: [Array],
            score: 91,
            _id: 5facdcf9cfceac3590ec63a5
          },
          {
            name: 'jerry',
            age: 17,
            hobby: [Array],
            score: 88,
            _id: 5facdcf9cfceac3590ec63a6
          }
  	],
  	insertedCount: 2,
  	insertedIds: { '0': 5facdcf9cfceac3590ec63a5, '1': 5facdcf9cfceac3590ec63a6 }
    }

查询

查询单条数据

    let res = await grades.findOne({
        name: 'jerry'
    });
    console.log(res);

查询多条数据

Tips: 返回的结果需要通过toArray()转换才能变成想要的格式.

    //查询多条时,需要通过 toArray() 转换成想要的格式
    let res = await grades.find().toArray();
    console.log(res);

指定查询条件

    let res = await grades.find({
        name: 'tom'
    }).toArray();

比较运算符$gt

    let res = await grades.find({
        age: {
            $gt: 18 //获取 age > 18 的
        }
    }).toArray();
    console.log(res);

逻辑运算符$and

    // $and 就相当于写两个条件
    // 获取 姓名为'holo'并且年龄为26的
    let res = await grades.find({
        name: 'holo',
        age: 26
    }).toArray();
    console.log(res);

正则表达式

    let res = await grades.find({
        name: {
            //姓名以H开头的
            $regex: /^h/
        }
    }).toArray();
    console.log(res);

$all$in$size

  • $all:查找指定字段中含有指定内容的所有数据
    let res = await grades.find({
        hobby: {
            $all: ['打豆豆']
        }
    }).toArray();
    console.log(res);
  • $in:查找指定字段中含有指定内容其中之一的所有数据
    let res = await grades.find({
        hobby: {
            $in: ['打豆豆', '抓老鼠']
        }
    }).toArray();
    console.log(res);
  • $size:查找指定字段中内容长度为 size 的所有数据
    let res = await grades.find({
        hobby: {
            $size: 2
        }
    }).toArray();
    console.log(res);

更多运算符

更多运算符

分页查询

limit()

查询前两条数据

    let res = await grades.find().limit(2).toArray();
    console.log(res);

skip()

跳过第一条数据,并获取之后的两条数据

    let res = await grades.find().skip(1).limit(2).toArray();
    console.log(res);

sort()

根据某个字段进行排序

    //age为 1 表示正序,age为 -1 表示倒序
    let res = await grades.find().sort({
        age: 1
    }).toArray();
    console.log(res);

分页

    const pageIndex = 2; //当前索引
    const pageSize = 3; //每一页显示的数据个数
    let res = await grades.find().skip((pageIndex - 1) * pageSize).limit(pageSize).toArray();
    console.log(res);

更新文档

    //将姓名为holo并且年龄为26的数据的姓名修改为'booboo'
    let res = await grades.updateOne({
        name: 'holo',
        age: 26
    }, {
        $set: {
            name: 'booboo'
        }
    })
    console.log(res.result);

删除文档

    //删除姓名为 jhon 的数据
    let res = await grades.deleteOne({
        name: 'jhon'
    })
    console.log(res.result);

聚合函数

Tips:需要使用$group对文档进行分组后才能使用聚合函数

    let res = await grades.aggregate([{
        $group: {
            _id: '$age',
            count: {
                $sum: 1
            }
        }
    }]).toArray();
    console.log(res);

注意 _id: '$age'age作为分组后的id值,这边只能时写_id,是固定的,保持和MongoDB中默认的id名一致,$sum: 1计算每个年龄的数据之和,当把1改成某个字段时将分别计算该字段相同值的和。