MongoDB基础知识总结


一、数据库分类

  • 关系型数据库(RDBMS)
    • MySQL、Oracle、DB2、SQL Server
  • 非关系型数据库(NoSQL)
    • 键值对数据库: Redis
    • 文档数据库: MongoDB

二、安装MongoDB

  • 数据库软件构成
    • 数据库的服务器
      • 数据库的服务器用来存放数据
      • mongod 用来启动服务器
    • 数据库的客户端
      • 客户端用来操作服务器,对数据进行增删改查的操作
      • mongo 用来启动客户端
  • 下载msi安装包
  • 打开安装包进行安装
  • 配置mongoDB安装路径到环境变量中 C:\Program Files\MongoDB\Server\4.0\bin
  • 在C盘根目录创建一个data文件夹,在data中创建db文件夹,用于存放数据库文件
  • 打开命令行工具,输入mongod,启动mongoDB服务器
    • 如果想要更改数据库默认存放目录及端口,使用命令mongod --dbpath 路径 --port 端口
  • 再打开一个命令行窗口,输入mongo,出现>,表示成功连接mongoDB服务器
  • 设为系统服务:开机自启,后台自动运行(4.0版本以后安装MongoDB的时候就可以开启此功能)(参见mongodb官网资料

三、相关概念

SQL概念 MongoDB概念
database 数据库 database 数据库
table 表 collection 集合
row 数据行 document 文档
column 数据字段 field 域
index 索引 index 索引
table joins 表链接 不支持
primary 主键 primary key 自动设置_id为主键
  • database 数据库
    数据库是一个仓库,在仓库中可以存放集合

    命名规范

    • UTF-8字符
    • 不能是空字符串
    • 不能含有空格、.$/\\0(空字符)
    • 全部小写
    • 最多64Byte。

    保留的数据库名

    • admin:root数据库
    • local:用于存储限于本地单台服务器的任意集合
    • config:用于保存分片相关的信息
  • collection 集合
    类似于数组,对应SQL中的table,在集合中可以存放文档
    命名规范

    • 不能是空字符串
    • 不能包含\0(空字符)
    • 不能以system.开头
    • 不能包含$
  • document 文档
    是MongoDB数据库中最小单位,我们存储和操作的内容都是文档。文档是一组键值对,采用BSON格式存储(BSON,一种类json的二进制形式的存储格式。)
    注意

    1. 文档中的键值对是有序的,例如{"username":"test","password":"123"}{"password":"123","username":"test"}是不同的文档。
    2. 文档的键是字符串,值可以是字符串,也可以是其它几种数据类型
    3. 区分类型和大小写。
    4. 键不能重复。

    命名规范

    • 不能含有\0(空字符)
    • .$有特别的意义,只有在特定环境下使用
    • _开头的键是保留的

四、数据类型

数据类型 描述
String 字符串,UTF-8编码的字符串才是合法的
Integer 整型数值
Boolean 布尔值
Double 双精度浮点值
Min/Max keys 将一个值与BSON元素的最低值和最高值相对比
Array 数组
Timestamp 时间戳,64位的值,前32位是一个time_t值,后32位是在某秒钟操作的一个递增的序数
Object 内嵌文档
Null 空值
Symbol 符号
Date 日期时间用UNIX时间格式来存储当前日期或时间
Object ID 对象ID
Binary Data 二进制数据
Code 代码类型
Regular expression 正则表达式类型

五、基本指令

启动mongo客户端

show dbs/databases        # 显示当前的所有数据库
use <database>            # 进入到指定的数据库中/创建不存在的数据库
db                        # 查看当前所处的数据库
show collections          # 显示当前数据库中的所有集合

db.dropDatabase()         # 删除数据库

六、CRUD指令

query指查询条件,documnent指文档。

  • 插入文档

    db.<collection>.insert()                                # 插入一个或多个文档
    db.<collection>.insertOne(document)                     # 插入一个文档      
    db.<collection>.insertMany([document1, document2, ...]) # 插入多个文档
    
    # 示例:
    db.users.insert({ name: 'admin', age: 16 })
    db.users.insertOne({ name: 'admin', age: 16 })
    db.users.insertMany([{ name: 'admin', age: 16 }, { name: 'admin2', age: 30 }])
  • 查询文档

    db.<collection>.find()                                                 # 查询所有文档
    db.<collection>.find(query)                                            # 查询符合查询条件的文档集合
    db.<collection>.findOne(query)                                         # 查询符合查询条件的第一个文档
    db.<collection>.find(query).count()                                    # 查询文档数量
    db.<collection>.find(query).limit(pageSize)                            # 限制查询数量
    db.<collection>.find(query).skip([pageNum-1]*pageSize).limit(pageSize) # 查询分页
    
    # 示例:
    db.users.find()
    db.users.find({ age: 16 })
    db.users.findOne({ age: 16 })
  • 修改

    db.<collection>.update(query, document)                # 替换文档
    db.<collection>.update(query, { $set:newDocument })   # 修改文档
    db.<collection>.updateMany(filter, update, options)    # 修改多个文档
    db.<collection>.updateOne(filter, update, options)     # 修改一个文档
    
    # 示例:
    db.users.update({ name: 'mike' }, { name: 'Jack' })    # 查找到的文档会被{ name:'Jack' }替换
    db.users.update({ name: 'mike', { $set: { age: 17 }}}) # 查到的第一个文档age值会被修改为17
  • 删除

    db.users.remove({})                         # 删除集合中所有文档
    db.<collection>.remove(query, options)      # 删除符合条件的文档
    db.<collection>.deleteOne(filter, options)  # 删除一个文档
    db.<collection>.deleteMany(filter, options) # 删除多个文档
    db.<collection>.drop()                      # 删除集合
    db.dropDatabase()                           # 删除数据库
    # 示例:
    db.users.remove({ name: 'Mike' })
    db.users.deleteOne()

七、操作符

  • 比较操作符
操作符 含义
$gt >
$gte >=
$lt <
$lte <=
$eq =
$ne !=
$type 数据类型

示例:

db.users.find({ age: { $gt: 20 }}) # 查询age>20的文档数据
db.users.find({ age: { $gt: 20, $lt: 40 }}) # 查询20<age<40的文档
db.blogs.find({"title": {$type: 'string'}}) # 查找title属性的值为string类型的文档

八、文档间的关系

  • 一对一
  • 一对多
  • 多对多

九、文档排序

# sort()可以用来指定文档的排序规则 
# 参数为{ <field>: 1|-1 }
# <field>为要排序的字段,1表示升序 -1表示降序
db.users.find({}).sort({ age: 1 }) # users集合中的文档按照age升序返回

十、限制查询的返回字段

默认情况下,MongoDB中的查询返回匹配文档中的所有字段。可以在查询中来配置指定货限制返回的字段。

db.inventory.find( { status: "A" }, { item: 1, status: 1 } ) # 查找status为A的文档,返回的查询结果仅包含item,status,_id三个字段
db.inventory.find( { status: "A" }, { item: 1, status: 1, _id: 0 } ) # 查找status为A的文档,返回的查询结果仅包含item,status两个字段

十一、使用mongoose连接mongoDB

// 引入
const mongoose = require('mongoose');

// 连接数据库
mongoose.connect("mongodb://localhost:27017/adminclient");

// 监听连接状态
const connection = mongoose.connection;
connection.once('open', function() {
    console.log('数据库连接成功');
})
connection.once('close', function() {
    console.log('数据库连接断开');
})

// 断开数据库连接(一般无需使用)
mongoose.disconnect()

// 定义Schema(集合中的文档结构)
const Schema = mongoose.Schema;

const blogSchema = new Schema({
    title:  String,
    author: String,
    body:   String,
    comments: [{ body: String, date: Date }],
    date: { type: Date, default: Date.now },
    hidden: Boolean,
    meta: {
      votes: Number,
      favs:  Number
    }
});

// 创建Model(文档集合),以便后续来操作集合
const BlogModel = mongoose.model('blog', blogSchema)

// 使用BlogModel来进行CRUD
BlogModel.create({
    title: '第一篇博客',
    author: 'Snail-Lu',
    body: '这是我的第一篇博客',
    comments: [{ body: '写的不错', date: '2022/4/1 22:23:14' }],
    date: '2022-4-1 22:22:22',
    hidden: false,
    meta: {
      votes: 10,
      favs:  10
    }
}, function(err) {
    if(!err) {
        console.log('插入成功')
    }
}) 

BlogModel.findOne({ title: '第一篇博客' }, function(err, doc) {
    if(!err) {
        // 利用document方法进行文档修改
        doc.$set({ hidden: true })
        doc.save()
    }
})

参考资料

  1. 菜鸟MongoDB教程
  2. MongoDB官方文档

文章作者: Snail-Lu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Snail-Lu !
  目录