1. 数据库操作
1.1 创建数据库
命令:
<!-- 该数据库不存在则创建,已存在则切换到此数据库 -->
use DATABASE_NAME
1.2 删除数据库
命令:
<!-- 切换数据库 -->
use DATABASE_NAME
<!-- 执行删除操作 -->
db.dropDatabase()
2. 集合操作
2.1 创建集合
命令:
<!-- 创建名称为“colName”的集合 -->
db.createCollection("colName")
<!--
options: 可选参数, 指定有关内存大小及索引的选项
(
capped:如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档,当该值为 true 时,必须指定 size 参数;
autoIndexId:3.2 之后不再支持该参数。(可选)如为 true,自动在 _id 字段创建索引。默认为 false;
size:为固定集合指定一个最大值,即字节数,如果 capped 为 true,必须指定该字段;
max:指定固定集合中包含文档的最大数量;
例:db.createCollection("colName", { capped : true, size : 1000000, max : 10000 } )
解释:创建固定集合“colName”,整个集合空间大小 1000000 KB, 文档最大个数为 10000 个
)
-->
db.createCollection("colName", options)
<!-- 查看已有集合 -->
show collections
或
show tables
2.2 删除集合
命令:
db.colName.drop()
3. 文档操作
文档的数据结构和 JSON 基本一样,所有存储在集合中的数据都是 BSON 格式,BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。
3.1 插入文档
命令:
<!-- 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据 -->
db.COLLECTION_NAME.insert(document)
<!-- 如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.COLLECTION_NAME.insertOne() 或 db.COLLECTION_NAME.replaceOne() 来代替 -->
db.COLLECTION_NAME.save(document)
<!--
document:要写入的文档;
writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求;
ordered:指定是否按顺序写入,默认 true,按顺序写入;
-->
<!-- 向集合插入一个新文档 -->
db.COLLECTION_NAME.insertOne(
<document>,
{
writeConcern: <document>
}
)
<!-- 向集合插入一个/多个文档 -->
db.COLLECTION_NAME.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
3.2 修改文档
命令:
<!-- update() 用于更新已存在的文档 -->
<!--
query : update的查询条件,类似sql update查询内where后面的;
update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的;
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入;
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新;
writeConcern :可选,抛出异常的级别;
-->
db.COLLECTION_NAME.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
<!-- save() 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入 -->
<!--
document : 文档数据;
writeConcern :可选,抛出异常的级别;
-->
db.COLLECTION_NAME.save(
<document>,
{
writeConcern: <document>
}
)
3.3 删除文档
命令:
<!-- remove() 函数是用来移除集合中的数据 -->
<!--
query :(可选)删除的文档的条件;
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档;
writeConcern :(可选)抛出异常的级别;
-->
db.COLLECTION_NAME.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
<!-- remove() 方法已经过时了,现在官方推荐使用 deleteOne() 和 deleteMany() 方法 -->
db.COLLECTION_NAME.deleteMany(<query>)
db.COLLECTION_NAME.deleteOne(<query>)
<!--
remove() 方法 并不会真正释放空间,需要继续执行 db.repairDatabase() 来回收磁盘空间
-->
db.repairDatabase()
或
db.runCommand({ repairDatabase: 1 })
3.4 查询文档
命令:
<!-- find() 方法以非结构化的方式来显示所有文档 -->
<!-- findOne() 方法,它只返回一个文档 -->
<!--
query :可选,使用查询操作符指定查询条件;
projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略);
-->
db.COLLECTION_NAME.find(query, projection)
<!-- field1 和 field2 是你要返回的字段。在投影操作符中,使用 1 表示返回该字段,使用 0 表示不返回该字段 -->
db.collection.find({}, { field1: 1, field2: 1 })
<!-- pretty() 方法以格式化的方式来显示所有文档 -->
db.COLLECTION_NAME.find().pretty()
3.4.1 MongoDB 与 RDBMS Where 语句比较
小于(less than)
大于(greater than)
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | {<key>:<value>} | db.col.find({"by":"菜鸟教程"}).pretty() | where by = '菜鸟教程' |
小于 | {<key>:{$lt:<value>}} | db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | {<key>:{$lte:<value>}} | db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
大于 | {<key>:{$gt:<value>}} | db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | {<key>:{$gte:<value>}} | db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
不等于 | {<key>:{$ne:<value>}} | db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
3.4.2 MongoDB AND 条件
命令:
<!-- find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件 -->
db.COLLECTION_NAME.find({key1:value1, key2:value2}).pretty()
3.4.3 MongoDB OR 条件
命令:
<!-- OR 条件语句使用了关键字 $or -->
db.COLLECTION_NAME.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
3.4.4 MongoDB 条件操作符
操作 | 操作符 |
---|---|
> | $gt |
< | $lt |
>= | $gte |
<= | $lte |
3.4.5 模糊查询
命令:
<!-- 查询 title 包含"A"字的文档: -->
db.COLLECTION_NAME.find({title:/A/})
<!-- 查询 title 字段以"A"字开头的文档:-->
db.COLLECTION_NAME.find({title:/^A/})
<!-- 查询 title 字段以"A"字结尾的文档:-->
db.COLLECTION_NAME.find({title:/A$/})
3.4.6 MongoDB $type 操作符(数据类型)
类型 | 数字 |
---|---|
Double | 1 |
String | 2 |
Object | 3 |
Array | 4 |
Binary data | 5 |
Undefined | 6 |
Object id | 7 |
Boolean | 8 |
Date | 9 |
Null | 10 |
Regular Expression | 11 |
JavaScript | 13 |
Symbol | 14 |
JavaScript (with scope) | 15 |
32-bit integer | 16 |
Timestamp | 17 |
64-bit integer | 18 |
Min key | 255 |
Max key | 127 |
例:
<!-- 获取 "col" 集合中 title 为 String 的数据,你可以使用以下命令:-->
db.col.find({"title" : {$type : 2}})
或
db.col.find({"title" : {$type : 'string'}})
3.4.7 MongoDB Limit与Skip方法
MongoDB Limit() 方法
命令:
<!-- MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数 -->
db.COLLECTION_NAME.find().limit(NUMBER)
MongoDB Skip() 方法
命令:
<!-- skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数 -->
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
3.4.8 MongoDB 排序
MongoDB sort() 方法
命令:
<!-- sort() 方法对数据进行排序 -->
<!--
sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式:
其中 1 为升序排列,而 -1 是用于降序排列
-->
db.COLLECTION_NAME.find().sort({KEY:1})
<!--
对于字符串数值类型,它是无法直接排序的
重新设置默认的collation属性.collation({"locale": "zh", numericOrdering:true})再排序
-->
db.COLLECTION_NAME.find().collation({"locale": "zh", numericOrdering:true}).sort({KEY:1})
注:skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()
3.4.8 MongoDB 索引
命令:
# createIndex() 方法来创建索引,Key 值为你要创建的索引字段:1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1
<!--
createIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)
例:db.COLLECTION_NAME.createIndex({"title":1,"description":-1})
-->
db.COLLECTION_NAME.createIndex(keys, options)
# 在后台创建索引,实例:
db.COLLECTION_NAME.createIndex({open: 1, close: 1}, {background: true})
# 1、查看集合索引
db.col.getIndexes()
# 2、查看集合索引大小
db.col.totalIndexSize()
# 3、删除集合所有索引
db.col.dropIndexes()
# 4、删除集合指定索引
db.col.dropIndex("索引名称")
3.4.9 MongoDB 聚合
aggregate() 方法
命令:
<!-- MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似 SQL 语句中的 count(*) -->
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
表达式 | 描述 | 实例 |
---|---|---|
$sum | 计算总和 | db.mycol.aggregate([{$ group : {_id : "$ by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | 计算平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | 获取集合中所有文档对应值得最小值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | 获取集合中所有文档对应值得最大值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | 在结果文档中插入值到一个数组中 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | 根据资源文档的排序获取第一个文档数据 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
3.5 管道的概念
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
聚合框架中常用的几个操作:
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
- $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
- $limit:用来限制MongoDB聚合管道返回的文档数。
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
- $group:将集合中的文档分组,可用于统计结果。
- $sort:将输入文档排序后输出。
- $geoNear:输出接近某一地理位置的有序文档。
例:
<!-- 1、$project实例 -->
db.article.aggregate(
{ $project : {
title : 1 ,
author : 1 ,
}}
);
<!-- 这样的话结果中就只还有_id,tilte和author三个字段了,默认情况下_id字段是被包含的,如果要想不包含_id话可以这样: -->
db.article.aggregate(
{ $project : {
_id : 0 ,
title : 1 ,
author : 1
}});
<!-- 2.$match实例 -->
<!-- $match用于获取分数大于70小于或等于90记录,然后将符合条件的记录送到下一阶段$group管道操作符进行处理。-->
db.articles.aggregate( [
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );
<!-- 3.$skip实例 -->
<!-- 经过$skip管道操作符处理后,前五个文档被"过滤"掉。 -->
db.article.aggregate(
{ $skip : 5 });
注:当 match 条件和 group 同时存在时,顺序会影响检索结果,必须先写 match 在前面。
4 时间关键字
- $dayOfYear: 返回该日期是这一年的第几天(全年 366 天)。
- $dayOfMonth: 返回该日期是这一个月的第几天(1到31)。
- $dayOfWeek: 返回的是这个周的星期几(1:星期日,7:星期六)。
- $year: 返回该日期的年份部分。
- $month: 返回该日期的月份部分( 1 到 12)。
- $week: 返回该日期是所在年的第几个星期( 0 到 53)。
- $hour: 返回该日期的小时部分。
- $minute: 返回该日期的分钟部分。
- $second: 返回该日期的秒部分(以0到59之间的数字形式返回日期的第二部分,但可以是60来计算闰秒)。
- $millisecond:返回该日期的毫秒部分( 0 到 999)。
- $dateToString: { $dateToString: { format: , date: } }。