面试问题浓缩总结 面试问题浓缩总结
  • Go
  • Java
  • C/C++
  • JavaScript/HTML
  • MySQL
  • Redis
  • MongoDB
  • 操作系统
  • 计算机网络
  • spring全家桶
  • mybatis
  • 中间件
  • 软件相关
  • 系统相关
  • 算法
  • 数据结构
  • 设计模式
  • CMU硕士经典100题
  • 剑指offer
  • 重点手撕代码
  • 程序员面试金典
  • 3月
  • 4月
  • 智力题
  • 业务问题
  • 一些技术
  • 安全相关
APP下载 (opens new window)
GitHub (opens new window)
  • Go
  • Java
  • C/C++
  • JavaScript/HTML
  • MySQL
  • Redis
  • MongoDB
  • 操作系统
  • 计算机网络
  • spring全家桶
  • mybatis
  • 中间件
  • 软件相关
  • 系统相关
  • 算法
  • 数据结构
  • 设计模式
  • CMU硕士经典100题
  • 剑指offer
  • 重点手撕代码
  • 程序员面试金典
  • 3月
  • 4月
  • 智力题
  • 业务问题
  • 一些技术
  • 安全相关
APP下载 (opens new window)
GitHub (opens new window)
  • MySQL

  • Redis

  • MongoDB

    • 面试问题汇总
    • 存储引擎
    • 索引
    • 分布式和集群
    • 体系和架构
    • 常用命令
      • 常用操作命令
        • 数据库操作命令
        • 插入数据
        • 数据查询
        • 聚合操作
  • 数据库
  • MongoDB
小游
2021-04-06

常用命令

# 常用操作命令

# 数据库操作命令

# 查看数据库
show dbs;
# 切换数据库(如果没有对应的数据库则创建)
use 数据库名;
# 创建集合
db.createCollection(集合名)
# 查看集合
show tables;
show collections;
# 删除集合
db.集合名.drop();
# 删除当前数据库
db.dropDatabase();
1
2
3
4
5
6
7
8
9
10
11
12
13

# 插入数据

# 插入单条数据
db.集合名.insert(文档)
# 例如:(如果没有 test ,会自动创建)
db.test.insert({name:"张三丰",birthday:new ISODate("1930-07-01"),gender:0,city:"HZ"});
# 插入多条数据
db.集合名.insert([文档,文档])
1
2
3
4
5
6

插入数据时 _id 没有指定,系统会自动生成(可以指定),默认_id 类型是 ObjectId 类型是一个12字节 BSON 类型数据,由以下格式组成:

  • 前 4 个字节表示时间戳 ObjectId("对象Id字符串").getTimestamp() 来获取;
  • 接下来的 3 个字节是机器标识码;
  • 紧接的两个字节由进程 id 组成(PID);
  • 最后三个字节是随机数;

# 数据查询

# 查询语句,没有条件或者空对象查询所有,sort 1 正序 -1 倒序,pretty 格式化
db.集合名.find({条件}).sort({key:1}).pretty();
1
2

# 比较操作

操作 条件格式 例子 RDBMS中的条件
等于 {key:value} db.collection.find({字段名:值}).pretty() where 字段名=值
大于 {key:{$gt:value}} db.collection.find({字段名:{$gt:值}}).pretty() where 字段名>值
小于 {key:{$lt:value}} db.collection.find({字段名:{$lt:值}}).pretty() where 字段名<值
大于等于 {key:{$gte:value}} db.collection.find({字段名:{$gte:值}}).pretty() where 字段名>=值
小于等于 {key:{$lte:value}} db.collection.find({字段名:{$lte:值}}).pretty() where 字段名<=值
不等于 {key:{$ne:value}} db.collection.find({字段名:{$ne:值}}).pretty() where 字段名!=值

# 逻辑条件

名称 例子
and db.集合名.find({key1:value1, key2:value2}).pretty()
or db.集合名.find({$or:[{key1:value1}, {key2:value2}]}).pretty()
not db.集合名.find({key:{$not:{$eq:value}}).pretty()

# 分页查询

db.集合名.find({条件}).sort({排序字段:排序方式})).skip(跳过的行数).limit(一页显示多少数据)
1

# 数据更新命令

# $set :设置字段值
# $unset :删除指定字段
# $inc:在值得基础上加一个数
db.集合名.update(
    <query>, # 更新条件
    <update>, # 上述操作
    {
    upsert: <boolean>, # 默认 false, true 表示 upsert
    multi: <boolean>, # 默认 false,true 更新满足条件的所有
    writeConcern: <document> # 指定 mongo 对写操作的回执行
    }
)
# 例如
db.c_user.update({name:"张三"},{$set:{age:12}},{multi:true})
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 数据删除命令

db.collection.remove(
  <query>,
  {
    justOne: <boolean>,
    writeConcern: <document>
  }
)
# 参数说明:
#  query(可选) :删除的文档的条件。
#  justOne(可选,用默认为 false):
#      如果设为 true 或 1,则只删除一个文档
#      如果不设置该参数,则删除所有匹配条件的文档。
#  writeConcern(可选):用来指定 mongod 对写操作的回执行为
1
2
3
4
5
6
7
8
9
10
11
12
13

# 聚合操作

聚合是 MongoDB 高级查询语言,它允许我们通过转化、合并多个文档的数据,来生成新的信息,例如:求最大值、最小值、平均值。也可以进行复杂数据统计、数据挖掘。聚合操作分为:单目的聚合操作(Single Purpose Aggregation Operation)、聚合管道(Aggregation Pipeline)、MapReduce 编程模型。

  • 单目聚合常用的有:count() 和 distinct()

    db.c_user.find().count();
    db.c_user.distinct("name");
    
    1
    2
  • 聚合管道:

    语法:db.collection.aggregate(AGGREGATE_OPERATION)

    #  例如: 统计 c_user 中各个 name 出现的次数
    db.c_user.aggregate([{$group:{_id:"$name",count:{$sum:1}}}])
    # 每个名字的平均年龄
    db.c_user.aggregate([{$group:{_id:"$name",avg:{$avg:"$age"}}}])
    # 获取每个 name 对应的年龄,返回值 {name:"张三",age_array:[12,34,53,47]}
    db.c_user.aggregate([{$group:{_id:"$name",age_array:{$push:"$age"}}}])
    
    1
    2
    3
    4
    5
    6

    常用的聚合操作如下

    表达式 描述
    $sum 计算总和
    $avg 求平均值
    $min 获取对应值的最小值
    $max 获取对应值的最大值
    $first 获取第一个文档数据
    $last 获取最后一个文档数据
    $push 把得到的数据插入到数组中
    $addToSet 把得到的数据插入到 set 中

MongoDB 中使用 db.collection.aggregate([{},...]) 方法来构建、使用聚合管道,每个文档在管道中经过一系列处理,输出相应结果。

操作 作用
$group 将集合中的文档分组,可用于统计结果
$project 修改输入文档的结构,用来重命名、增加或删除域、创建计算结果、嵌套文档
$match 用于过滤数据,只输出符合条件的文档
$limit 用来限制 MongoDB 返回的文档数
$skip 在跳过指定数量的文档,返回余下文档
$sort 将输入文档排序后输出
$geoNear 输出接近某一地理位置的有序文档
  # 统计每个 name 的平均年龄,重新命名 avg ,输出 {name:"张三",age:12},而不是 {name:"张三",avg:12}
  db.c_user.aggregate([
    {$group : {_id: "$name", avg:{$avg:"$age"}}},
    {$project : {name: "$name", age : "$avg"}}
  ])
  # 统计每个 name 出现次数,过滤小于等于 12 次的
  db.c_user.aggregate([
    {$group:{_id: "$name",count:{$sum : 1}}},
    {$match:{count:{$gt:12}}}
  ])

1
2
3
4
5
6
7
8
9
10
11
  • MapReduce 编程模型

MapReduce 和 Pipeline 都能用于文档聚合, Pipeline 查询速度快于 MapReduce,MapReduce 能够在多台 Server 上并行执行复杂的聚合逻辑。MongoDB 不允许 Pipeline 的单个聚合操作占用过多的系统内存,如果一个聚合操作消耗 20% 以上的内存,MongoDB 就会停止操作,并向客户端输出错误消息。MapReduce 是一种计算模型,它将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。

参考:

  • MongoDB 入门及底层原理 (juejin.cn) (opens new window)
编辑 (opens new window)
上次更新: 2021/04/06, 22:01:45
体系和架构

← 体系和架构

Theme by Vdoing | Copyright © 2021-2021 小游
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式