chaoz的杂货铺

生命有息、学无止境、折腾不止

0%

MongoDB由浅入深

MongoDB 教程

举例说明

id user_name email age city
1 Mark Hanks mark@abc.com 25 Los Angeles
2 Richard Peter richard@abc.com 31 Dallas

{
“_id”: ObjectId(“5146bb52d8524270060001f3”),
“age”:25,
“city”:”Los Angele3”,
“email”:”mark@ abc. com”,
“user_name”:”Mark Hanka”
}
{
“_id”: ObjectId(“5146bb52d8524270060001f2”),
“age”:31,
“city”:”Dallas”,
“email”:”richardeabc. com”,
“user name”:”Richard Peter”
}

MongoDB 与 RDBMS 术语的比较:

SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接,MongoDB不支持
primary key primary key 主键,MongoDB自动将_id字段设置为主键

MongoDB 与 RDBMS Where 语句比较

操作 格式 范例 RDBMS中的类似语句
等于 {:} db.col.find({“by”:”XCHCOUD”}).pretty() where by = ‘XCHCOUD’
小于 {:{$lt:}} db.col.find({“likes”:{$lt:50}}).pretty() where likes < 50
小于或等于 {:{$lte:}} db.col.find({“likes”:{$lte:50}}).pretty() where likes <= 50
大于 {:{$gt:}} db.col.find({“likes”:{$gt:50}}).pretty() where likes > 50
大于或等于 {:{$gte:}} db.col.find({“likes”:{$gte:50}}).pretty() where likes >= 50
不等于 {:{$ne:}} db.col.find({“likes”:{$ne:50}}).pretty() where likes != 50

MongoDB AND 条件

db.col.find({key1:value1, key2:value2}).pretty()

MongoDB OR 条件

1
2
3
4
5
6
   {
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()

AND 和 OR 联合使用

SQL:

where likes>50 AND (by = '菜鸟教程' OR title = 'MongoDB 教程')

MongoDB:

{$gt:50}, $or: [{"by": "XCHCLOUD"},{"title": "MongoDB 教程"}]}).pretty()
1
2
3
4
5
6
7
8
9
10
11
12
13
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "XCHCLOUD",
"url" : "http://XCHCLOUD.cn",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}

条件操作符

MongoDB Mysql
> 大于 $gt db.col.find({likes : {$gt : 100}}) Select * from col where likes > 100;
< 小于 $lt db.col.find({likes : {$lt : 150}}) Select * from col where likes < 150;
>= 大于等于 $gte db.col.find({likes : {$gte : 100}}) Select * from col where likes >=100;
<= 小于等于 $lte db.col.find({likes : {$lte : 150}}) Select * from col where likes <= 150;
>和< 小于大于 $lt 和 $gt db.col.find({likes : {$lt :200, $gt : 100}}) Select * from col where likes>100 AND likes<200;

$type 操作符

$type 操作符是基于 BSON 类型来检索集合中匹配的数据类型,并返回结果。

类型 数字 备注
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 Query with -1.
Max key 127

Limit与Skip方法

Limit() 方法

limit()方法在MongoDB中读取指定数量的数据记录,该参数指定从MongoDB中读取的记录条数。

db.COLLECTION_NAME.find().limit(NUMBER)

Skip() 方法

skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。

db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

集合

集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。

创建集合

db.createCollection(name, options)

参数说明:

参数 说明
name 要创建的集合名称
options 可选参数, 指定有关内存大小及索引的选项

options参数:
| 字段 | 类型 | 描述 |
|————- |—— |—————————————————————————————————————————————————– |
| capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。 |
| autoIndexId | 布尔 | (可选)如为 true,自动在 _id 字段创建索引。默认为 false。 |
| size | 数值 | (可选)为固定集合指定一个最大值(以字节计)。如果 capped 为 true,也需要指定该字段。 |
| max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |

删除集合

db.collection.drop()

文档

插入文档

db.COLLECTION_NAME.insert(document)

可以将数据定义为变量形式

db.col.insert(document)

查看已插入文档

db.col.find()

更新文档

update() 方法

update() 方法用于更新已存在的文档。

1
2
3
4
5
6
7
8
   <query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)

参数说明:

参数 说明
query update的查询条件,类似sql update查询内where后面的。
update update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为sql update查询内set后面的
upsert 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern 可选,抛出异常的级别。

save() 方法

save() 方法通过传入的文档来替换已有文档。

1
2
3
4
5
   <document>,
{
writeConcern: <document>
}
)

参数说明:

参数 说明
document 文档数据。
writeConcern 可选,抛出异常的级别。

删除文档

2.6 版本以前的

1
2
3
   <query>,
<justOne>
)

2.6版本以后的

1
2
3
4
5
6
   <query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)

参数说明:
| 参数 | 说明 |
|————– |—————————————————————————————————————- |
| query | (可选)删除的文档的条件。 |
| justOne | (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。 |
| writeConcern | (可选)抛出异常的级别。 |

查询文档

db.collection.find(query, projection).pretty()

除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。

参数说明:

参数 说明
query 可选,使用查询操作符指定查询条件
projection 可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
.pretty() pretty() 方法以格式化的方式来显示所有文档

元数据

Obiectld

ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes,含义是:

0、1、2、3 4、5、6 7、8 9、10、11
时间戳 机器 pID 计数器

MongoDB 中存储的文档必须有一个 _id 键。这个键的值可以是任何类型的,默认是个 ObjectId 对象

排序

使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。

db.COLLECTION_NAME.find().sort({KEY:1})

索引

createIndex() 方法

db.collection.createIndex(keys, options)
语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,-1 为指定按降序创建索引;createIndex() 方法中你也可以设置使用多个字段创建索引。

可选参数

Parameter Type Description
background Boolean 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 “background” 可选参数。 “background” 默认值为false。
unique Boolean 建立的索引是否唯一。指定为true创建唯一索引。默认值为false.
name string 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
dropDups Boolean 3.0+版本已废弃。在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false.
sparse Boolean 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.
expireAfterSeconds integer 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
v index version 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。
weights document 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
default_language string 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语
language_override string 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.

聚合

主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。

aggregate() 方法

db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

比较mysql

select by_user, count(*) from mycol group by by_user

聚合的表达式

表达式 描述 实例
$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”}}}])

管道

管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。

参数

$project 修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
$match 用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
$limit 用来限制MongoDB聚合管道返回的文档数。
$skip 在聚合管道中跳过指定数量的文档,并返回余下的文档。
$unwind 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
$group 将集合中的文档分组,可用于统计结果。
$sortr 输出接近某一地理位置的有序文档。

备份(mongodump)与恢复(mongorestore)

数据备份

导出所有数据到指定目录中

mongodump -h dbhost -d dbname -o dbdirectory

参数:

h MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
d 需要备份的数据库实例,例如:test
o 备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。

数据恢复

mongorestore -h <hostname><:port> -d dbname <path>

参数:

–host <:port>, -h <:port> MongoDB所在服务器地址,默认为: localhost:27017
–db , -d 需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
–drop 恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test。你不能同时指定 和 –dir 选项,–dir也可以设置备份目录。
–dir 指定备份的目录。你不能同时指定 和 –dir 选项

监控

mongostat 命令

它会间隔固定时间获取mongodb的当前运行状态,并输出。

mongotop 命令

用来跟踪一个MongoDB的实例,查看哪些大量的时间花费在读取和写入数据。mongotop提供每个集合的水平的统计数据。默认情况下,mongotop返回值的每一秒。

mongotop <sleeptime>

参数:

等待的时间长度,以秒为单位,mongotop等待调用之间。通过的默认mongotop返回数据的每一秒。

mongotop --locks

返回参数说明

ns 包含数据库命名空间,后者结合了数据库名称和集合。
db 包含数据库的名称。名为 . 的数据库针对全局锁定,而非特定数据库。
total mongod花费的时间工作在这个命名空间提供总额。
read 提供了大量的时间,这mongod花费在执行读操作,在此命名空间。
write 提供这个命名空间进行写操作,这mongod花了大量的时间。

查询分析

可以确保我们建议的索引是否有效,是查询语句性能分析的重要工具。

explain()

提供了查询信息,使用索引及查询统计等。

创建 gender 和 user_name 的索引:
db.users.ensureIndex({gender:1,user_name:1})
现在在查询语句中使用 explain :
>db.users.find({gender:"M"},{user_name:1,_id:0}).explain()

返回结果参数说明

indexOnly 字段为 true ,表示我们使用了索引。
cursor 因为这个查询使用了索引,MongoDB 中索引存储在B树结构中,所以这是也使用了 BtreeCursor 类型的游标。如果没有使用索引,游标的类型是 BasicCursor。这个键还会给出你所使用的索引的名称,你通过这个名称可以查看当前数据库下的system.indexes集合(系统自动创建,由于存储索引信息,这个稍微会提到)来得到索引的详细信息。
n 当前查询返回的文档数量。
nscanned/nscannedObjects 表明当前这次查询一共扫描了集合中多少个文档,我们的目的是,让这个数值和返回文档的数量越接近越好。
millis 当前查询所需时间,毫秒数。
indexBounds 当前查询具体使用的索引。

hint()

使用 hint 来强制 MongoDB 使用一个指定的索引。

指定了使用 gender 和 user_name 索引字段来查询:
>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})
可以使用 explain() 函数来分析以上查询:
>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()

原子操作常用命令

$set 用来指定一个键并更新键值,若键不存在并创建。 { $set : { field : value } }
$unset 用来删除一个键。 { $unset : { field : 1} }
$inc $inc可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作。 { $inc : { field : value } }
$push 把value追加到field里面去,field一定要是数组类型才行,如果field不存在,会新增一个数组类型加进去。 { $push : { field : value } }
$pushAll 同$push,只是一次可以追加多个值到一个数组字段内。 { $pushAll : { field : value_array } }
$pull 从数组field内删除一个等于value值。 { $pull : { field : _value } }
$pop 删除数组的第一个或最后一个元素 { $pop : { field : 1 } }
$rename 修改字段名称 { $rename : { old_field_name : new_field_name } }
$bit 位操作,integer类型 {$bit : { field : {and : 5}}}
$addToSet 增加一个值到数组内,而且只有当这个值不在数组内才增加。
偏移操作符 t.find() { “_id” : ObjectId(“4b97e62bf1d8c7152c9ccb74”), “title” : “ABC”, “comments” : [ { “by” : “joe”, “votes” : 3 }, { “by” : “jane”, “votes” : 7 } ] }

MongoDB Java

下载mongo jar包,下载地址:http://mongodb.github.io/mongo-java-driver/, 请确保下载最新版本。

http://mongodb.github.io/mongo-java-driver/3.0/driver/getting-started/quick-tour/

喜欢这篇文章?打赏一下作者吧!

欢迎关注我的其它发布渠道