MonogoDB 数据库基本使用和常用命令

本文简单介绍了 mongodb 数据库的基本概念以及基础用法

一、简介

  • MongoDB 是为快速开发互联网 Web 应用而设计的数据库系统
  • MongoDB 的设计目标是极简、灵活、作为 Web 应用栈的一部分
  • MongoDB 的数据模型是面向文档的,所谓文档,是一种类似于 JSON 的结构,简单理解 MongoDB 这个数据库中存的是各种各样的 JSON(BJSON)

二、相关概念及名词

  • 数据库:是一个仓库,在仓库中可以存放集合

  • 集合

    • 类似于数组,在集合中可以存放文档
    • 存储的文档可以是多种多样的,没有格式要求
  • 文档

    • 数据库中的最小单位,对数据库进行存储和操作的内容都是文档
    • 类似于 JS 中的对象,在 MongoDB 中每一条数据就是一个文档

多个文档组成集合,多个集合组成数据库


三、常用指令

基本指令

  • show dbs/ databases: 显示当前的所有数据库
  • use 数据库名:进入到指定的数据库中 eg: use my_test
  • db :表示的是当前所处的数据库
  • show collections:显示数据库中所有的集合

增删改查(CRUD)指令

新增(INSERT)

  • 向数据库中插入文档:db.<collection>.insert(doc)
    • 向集合中插入一个或多个文档
    • 向集合中插入文档时,如果没有给文档指定 id 属性,则数据库会自动为文档添加 _id,该属性用来作为文档的唯一标识
    • _id 我们可以自己指定,如果我们指定了,则数据库就不会再自动生成了。如果自己指定 _id,也必须确保它的唯一性
    • 例子:向 test 数据库中的 students 集合中插入一个新的学生对象:{name: "小明", age: 18, addr: "male"}
      use test;
      db.students.insert({name: "小明", age: 18, addr: "三味书屋"});
      
  • db.<collection>.insertOne(doc):向数据库中插入一条数据
  • db.<collection>.insertMany(doc):向数据库中插入多条数据

示例:

use test;

// 插入一条
db.students.insert({name: "小明", age: 18, addr: "三味书屋", salary: 3000});

// 插入多条
db.students.insert([{name: "小红", age: 16, addr: "东方明珠", salary: 5000}, {name: "小白", age: 19, addr: "王府井", salary: 6000}]);

// 等同于下面的方式

// 插入一条
db.students.insertOne({name: "小明", age: 18, addr: "三味书屋", salary: 3000});

// 插入多条
db.students.insertMany([{name: "小红", age: 16, addr: "东方明珠", salary: 5000}, {name: "小白", age: 19, addr: "王府井", salary: 6000}]);

查询(QUERY)

  • db.<collection>.find()
    • 默认查询当前集合中的所有文档
    • find({}):也是查询当前集合中所有的文档
    • 返回的是一个数组
    • 接收一个对象作为参数,必须满足对象中所有的属性
    • .count(): 查询出所有结果的数量
    • .length(): 查询出所有结果的数量
  • db.<collection>.findOne():查询集合中符合条件的第一个文档
    • 返回的是一个对象
use test

// 查询集合中所有的文档(实际项目中不会这么操作)
db.students.find();

// 查询集合中符合条件的所有文档
db.students.find({ age: 19 });

// 查询符合条件的第一个文档
db.students.findOne({ age: 19 });

// 查询符合条件的文档数目
db.students.find({ age: 19 }).count();
// 或
db.students.find({ age: 19 }).length();
投影
  • db.<collection>.find(filter, options)
    • filter:查询条件对象
    • options: 投影条件对象,需要展示的属性设置为 1,不需要展示的属性设置为 0
  • .limit(num):显示多少个文档
  • .skip(num):跳过多少个文档
  • .sort({ key1: 1, key2: -1 }):按照 key1 正序排列,排完之后再按照 key2 倒序排列

示例

use test;

// 查询 students 集合中所有对象,只展示 age 字段
db.students.find({}, { age: 1 });

// 查询 students 集合中所有对象,不展示 age 字段
db.students.find({}, { age: 0 });

// 查询 students 集合,只展示符合条件的前 2 条数据
db.students.find({}).limit(2);

// 查询 students 集合中所有对象,跳过前 2 条数据
db.students.find({}).skip(2);

// 查询 students 集合中所有对象,按 age 正序排列
db.students.find({}).sort({ age: 1 });

// 查询 students 集合中所有对象,按 age 倒序排列
db.students.find({}).sort({ age: -1 });
常用查询器
  • $gt:大于
  • $gte:大于等于
  • $eq:等于
  • $lt:小于
  • $lte:小于等于
  • $or:或者

之前查询不使用任何查询器时,条件的判断是包含,不是相等

示例:

// 工资大于 3000
db.students.find({salary: { $gt: 3000 }});

// 工资大于等于 3000
db.students.find({salary: { $gte: 3000 }});

// 工资等于 3000
db.students.find({salary: { $eq: 3000 }});

// 工资小于 6000 
db.students.find({salary: { $lt: 6000 }});

// 工资小于等于 6000
db.students.find({salary: { $lte: 6000 }});

// 工资大于 3000 且小于 6000 
db.students.find({salary: { $gt: 3000, $lt: 6000 }});

// 工资是 3000 或者 名字是 小白
db.students.find({$or: [ {salary: 3000}, {name: "小白"} ]});

更新(UPDATE)

  • db.<collection>.update(查询条件, 新对象, [options])
    • options: 配置对象
      • upsert: <boolean>
      • multi: <boolean> 是否跟新多条,默认是 false
      • writeConcern: <document>
      • collation: <document>
    • update() 默认情况下会使用新对象来替换旧的对象
    • 如果需要修改指定的属性,而不是替换,则需要使用 “修改操作符” 来完成
    • $set: 修改操作符,修改属性值。
    • $unset: 修改操作符,删除属性值。
      • db..update({ name: “zgd” }, {$set: { age: 21 }})
    • 默认情况下只会更新匹配到的第一个文档对象
  • db..updateOne(查询条件, 新对象):修改第一个符合条件的文档
  • db..updateMany(查询条件, 新对象):同时修改多个符合条件的文档
  • db..replaceOne(查询条件, 新对象):替换一个文档

示例

use test

// 修改一条数据
db.students.update({name: '小明'}, {$set: { age: 19 }});

// 等同于 updateOne
db.students.updateOne({name: '小明'}, {$set: { age: 19 }});

// 修改多条数据
db.students.update({age: 19}, {$set: { addr: '水月洞天' }}, { multi: true });

// 等同于 updateMany
db.students.updateMany({age: 19}, {$set: { addr: '水月洞天' }});

// 数据替换
db.students.update({age: 16}, { name: '小花', age: 14, addr: '迪士尼乐园' });

// 等同于 replaceOne
db.students.replaceOne({age: 16}, { name: '小花', age: 14, addr: '迪士尼乐园' });

常用修改器:

  • $set: 设置属性
  • $unset:删除属性
  • $push:向数组中添加一条数据
  • $addToSet:向数组中添加一条数据,与 $push 的区别:若数据已存在,则不再添加
  • $inc(只能用于 Number 类型的值):用来增加已有属性的值,若属性不存在,则创建该属性
// 修改 addr 属性
db.students.updateMany({age: 19}, { $set: { addr: '花果山' } });

// 为小花删除 age 属性
db.students.updateOne({name: '小花' }, { $unset: { age: '' } });

// 先为小明添加一个 hobby 属性,其中有一个 cities 属性是一个数组
db.students.updateOne({name: '小明' }, { $set: { hobby: { cities: '北京', '上海' } } });
// 为小明的 cities 属性 添加一个 '杭州',可以通过 . 操作符为下级属性赋值,但是必须用 "" 引号包裹起来
db.students.updateOne({name: '小明' }, { $push: { "hobby.cities": '杭州' } });

// 将 addr 为 '花果山' 的文档,年龄都加 2 岁
db.students.updateMany({addr: '花果山'}, { $inc: { age: 2 } });

删除(DELETE)

  • db.<collection>.remove(查询条件, [justone]])
    • 默认删除所有符合条件的文档
    • 不传查询对象会报错
    • 如果传递一个空对象 {} 作为参数,则会删除集合中的所有数据。使用这种方式清空集合性能较差
    • justone<boolean> 默认是 false,设置为 true,则只会删除匹配到的第一个文档
  • db.<collection>.deleteOne(查询条件):删除匹配到的第一个文档
  • db.<collection>.deleteMany(查询条件):删除匹配到的所有文档

示例

// 删除一条
db.students.remove({ name: '小花' }, true);

// 等同于 deleteOne
db.students.deleteOne({ name: '小花' });

// 删除多条
db.students.remove({ age: '19' });

// 等同于
db.students.deleteMany({ age: '19' });

// 删除所有数据(不建议使用这种方式清空数据,速度较慢)
db.students.deleteMany({});

删除集合和数据库

  • db.<collection>.drop(): 删除集合
  • db.dropDatabase():删除数据库

示例

// 删除 students 集合(建议使用这种方式清空数据,速度较快)
db.students.drop();

// 删除当前数据库
db.dropDatabase();

四、参考链接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章