什么是MongoDB ?
- MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
- 在高负载的情况下,添加更多的节点,可以保证服务器性能。
- MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
- MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
主要特点
- MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
- 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName=“Sameer”,Address=“8 Gandhi Road”)来实现更快的排序。
- 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
- 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
- Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
- MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
- Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
- Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
- Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
- GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
- MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
- MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
- MongoDB安装简单。
Mongodb语法
- 创建数据库
use DATABASE_NAME(如果数据库不存在,则创建数据库,否则切换到指定数据库,DATABASE_NAME为数据库名称) - 查看所有数据库
show dbs - 创建集合
db.createCollection(name, options)
name: 要创建的集合名称
options: 可选参数, 指定有关内存大小及索引的选项
options 可以是如下参数
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。 |
autoIndexId | 布尔 | (可选)如为 true,自动在 _id 字段创建索引。默认为 false。 |
size | 数值 | (可选)为固定集合指定一个最大值,以千字节计(KB)。如果 capped 为 true,也需要指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
实例:
db.createCollection(“mycollection”, { capped : true, autoIndexId : true, size :6142800, max : 10000})
MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合
db.mycollection.insert({“name” : “菜鸟教程”}),会自动创建mycol2集合
- 查看已有集合
show collections 或 show tables - 删除集合
db.COLLECTION_NAME.drop()
db.mycollection.drop()
- 插入文档
db.COLLECTION_NAME.insert(document) (文档的数据结构和 JSON 基本一样,所有存储在集合中的数据都是 BSON 格式) - 更新文档 update()
db.COLLECTION_NAME.update(
< 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 :可选,抛出异常的级别。
实例:
db.mycollection.update({‘title’:‘MongoDB 教程’},{$set:{‘title’:‘MongoDB’}},{multi:true})
只更新第一条记录:
db.mycollection.update( { “count” : { $gt : 1 } } , { $set : { “test2” : “OK”} } );
全部更新:
db.mycollection.update( { “count” : { $gt : 3 } } , { $set : { “test2” : “OK”} },false,true );
只添加第一条:
db.mycollection.update( { “count” : { $gt : 4 } } , { $set : { “test5” : “OK”} },true,false );
全部添加进去:
db.mycollection.update( { “count” : { $gt : 5 } } , { $set : { “test5” : “OK”} },true,true );
全部更新:
db.mycollection.update( { “count” : { $gt : 15 } } , { $inc : { “count” : 1} },false,true );
只更新第一条记录:
db.mycollection.update( { “count” : { $gt : 10 } } , { $inc : { “count” : 1} },false,false );
- 更新文档 save()
db.COLLECTION_NAME.save(
< document >,
{
writeConcern: < document >
}
)
参数说明:
document : 文档数据。
writeConcern :可选,抛出异常的级别
实例:
db.mycollection.save({
“_id” : ObjectId(“56064f89ade2f21f36b03136”),
“title” : “MongoDB”,
“description” : “MongoDB 是一个 Nosql 数据库”,
“by” : “Runoob”,
“url” : “http://www.runoob.com”,
“tags” : [
“mongodb”,
“NoSQL”
],
“likes” : 110
})
- 删除文档
db.COLLECTION_NAME.remove(
< query >,
{
justOne: < boolean >,
writeConcern: < document >
}
)
参数说明:
query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
writeConcern :(可选)抛出异常的级别。
db.mycollection.remove({‘title’:‘MongoDB 教程’})
db.mycollection.remove({‘title’:‘MongoDB 教程’},1)
- 查询文档
db.COLLECTION_NAME.find(query, projection)
query :可选,使用查询操作符指定查询条件
projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
以易读的方式来读取数据,可以使用 pretty() 方法
db.COLLECTION_NAME.find().pretty()
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。
db.mycollection.find({key1:value1, key2:value2}).pretty()
db.col.find({“by”:“菜鸟教程”, “title”:“MongoDB 教程”}).pretty()
{
“_id” : ObjectId(“56063f17ade2f21f36b03133”),
“title” : “MongoDB 教程”,
“description” : “MongoDB 是一个 Nosql 数据库”,
“by” : “菜鸟教程”,
“url” : “http://www.runoob.com”,
“tags” : [
“mongodb”,
“database”,
“NoSQL”
],
“likes” : 100
}
OR 条件语句使用了关键字 $or,语法格式如下:
db.col.find(
{ $or: [ {key1: value1}, {key2:value2}]}
).pretty()
db.col.find({$or:[{“by”:“菜鸟教程”},{“title”: “MongoDB 教程”}]}).pretty()
{
“_id” : ObjectId(“56063f17ade2f21f36b03133”),
“title” : “MongoDB 教程”,
“description” : “MongoDB 是一个 Nosql 数据库”,
“by” : “菜鸟教程”,
“url” : “http://www.runoob.com”,
“tags” : [
“mongodb”,
“database”,
“NoSQL”
],
“likes” : 100
}
AND 和 OR 联合使用
db.col.find({“likes”: {$gt:50}, $or: [{“by”: “菜鸟教程”},{“title”: “MongoDB 教程”}]}).pretty()
{
“_id” : ObjectId(“56063f17ade2f21f36b03133”),
“title” : “MongoDB 教程”,
“description” : “MongoDB 是一个 Nosql 数据库”,
“by” : “菜鸟教程”,
“url” : “http://www.runoob.com”,
“tags” : [
“mongodb”,
“database”,
“NoSQL”
],
“likes” : 100
}
条件查询
操作 | 格式 | 范例 | 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 |
- 读取的记录条数 limit()
db.COLLECTION_NAME.find().limit(NUMBER)
db.mycollection.find({},{“title”:1,_id:0}).limit(2)
skip方法同样接受一个数字参数作为跳过的记录条数db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
db.mycollection.find({},{“title”:1,_id:0}).limit(1).skip(1)
- 排序 sort()
db.COLLECTION_NAME.find().sort({KEY:1})
1 为升序排列,而 -1 是用于降序排列
db.col.find({},{“title”:1,_id:0}).sort({“likes”:-1})
- 索引
db.COLLECTION_NAME.ensureIndex() (3.0以前的版本)
db.COLLECTION_NAME.createIndex(keys, options)
1 为指定按升序创建索引,降序来创建索引指定为 -1
db.col.createIndex({“title”:1})
db.col.createIndex({“title”:1,“description”:-1})
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 |
在后台创建索引
db.mycollection.createIndex({open: 1, close: 1}, {background: true})
- 聚合
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 : { m a x : " max : " 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:将集合中的文档分组,可用于统计结果。
$sort:将输入文档排序后输出。
$geoNear:输出接近某一地理位置的有序文档。
实例
db.article.aggregate( { $project : { title : 1 ,author : 1 ,}} );
显示_id, title, author字段
db.article.aggregate({ $project : { _id : 0 , title : 1 , author : 1 }});
不显示_id,显示title, author
db.articles.aggregate( [{ $match : { score : { $gt : 70, $lte : 90 } } }, { $group: { _id: null, count: { $sum: 1 } } } ] );
db.article.aggregate({ $skip : 5 });