常用命令
# 常用操作命令
# 数据库操作命令
# 查看数据库
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
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
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
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
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
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
2
3
4
5
6
7
8
9
10
11
- MapReduce 编程模型
MapReduce 和 Pipeline 都能用于文档聚合, Pipeline 查询速度快于 MapReduce,MapReduce 能够在多台 Server 上并行执行复杂的聚合逻辑。MongoDB 不允许 Pipeline 的单个聚合操作占用过多的系统内存,如果一个聚合操作消耗 20% 以上的内存,MongoDB 就会停止操作,并向客户端输出错误消息。MapReduce 是一种计算模型,它将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。
参考:
编辑 (opens new window)
上次更新: 2021/04/06, 22:01:45