MongoDB数据库

@wintry大约 6 分钟

增删查改

创建数据库

use DATABASE_NAME
--如果数据库不存在,则创建数据库,否则切换到指定数据库。
--如果你想查看所有数据库,可以使用 show dbs 命令。

删除数据库

db.dropDatabase()

--集合删除语法格式如下:
db.collection.drop()

创建集合

db.createCollection(user)

show tables --查看已有集合

插入文档

文档的数据结构和 JSON 基本一样。

所有存储在集合中的数据都是 BSON 格式。

BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。

MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:

db.col_name.insert(
{
    title: 'MongoDB', 
    url: 'http://www.baidu.com',
    tags: ['mongodb', 'database'],
    likes: 100
}
)

更新文档

db.collection.update(
  <query>,
  <update>,
  {
    upsert: <boolean>,
    multi: <boolean>,
  }
)
  • query : update的查询条件,类似sql update查询内where后面的。
  • update : update的对象和一些更新的操作符(如,,inc...)等,也可以理解为sql update查询内set后面的
  • upsert : 如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi : 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
db.col.update(
    {'title':'MongoDB 教程'},
    {$set:{'title':'MongoDB'}},
    {multi:true},
    {upsert:true}
)

删除文档

--移除 title 为 'MongoDB 教程' 的文档:
>db.col.remove({'title':'MongoDB 教程'})
WriteResult({ "nRemoved" : 2 })

--如果你只想删除第一条找到的记录可以设置 justOne 为 1,如下所示:
>db.col.remove({'title':'MongoDB 教程'},1)

查询文档

db.col.find().pretty()

limit方法

--limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。
db.col.find({},{"title":1,_id:0}).limit(2)

skip方法

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

以下实例只会显示第二条文档数据

db.col.find({},{"title":1,_id:0}).limit(1).skip(1)

排序

sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式

其中 1 为升序排列,而 -1 是用于降序排列。

db.col.find({},{"title":1,_id:0}).sort({"likes":-1})

索引

索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。

这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。

索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构

MongoDB使用 createIndex() 方法来创建索引。

--createIndex()方法基本语法格式如下所示:
>db.collection.createIndex(keys, options)

--语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可
>db.col.createIndex({"title":1})

聚合

主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。

有点类似 SQL 语句中的 count(\*) MongoDB中聚合的方法使用aggregate()。

> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])

--以上实例类似sql语句:
select by_user, count(*) from mycol group by by_user

数据库备份

MongoDB 分片

在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。

当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。

这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。

MongoDB 备份

在Mongodb中使用mongodump命令来备份MongoDB数据;该命令可以导出所有数据到指定目录中。

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

MongoDB 恢复

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

性能监控

mongostat 命令

mongostat是mongodb自带的状态检测工具,在命令行下使用。

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

insert query update delete getmore command dirty used flushes vsize  res qrw arw net_in net_out conn         time

  *0  1042   832   *0    0  1878|0  0.0% 0.0%    0 1.05G 62.0M 0|0 1|1  465k  12.0m   4 Apr 28 11:11:22.325
参数说明
inserts每秒插入次数
Query每秒查询次数
Update每秒更新次数
Delete每秒删除次数
Getmore每秒执行getmore次数,查看更多的意思,我们每次查询数据时,如果一次数据量比较大,超过了mongodb一次能查询的最大数据量,那么mongodb就回把这次要查询的数据分成几次查询,分别返回
Command每秒的命令数,比以上插入、查找、更新、删除的综合还多,还统计了别的命令
DirtyWiredTiger存储引擎中dirty 数据占缓存百分比
UsedWiredTiger存储引擎中引擎使用缓存占百分比
Flushes每秒执行fsync将数据写入硬盘的次数, WiredTiger存储引擎中,flushes是指WiredTiger循环创建检查点的时间间隔。每隔一段时间,mongodb就将内存上的数据写入硬盘,如果这个数值比较大的话,会影响性能
Vsize虚拟内存使用量,单位MB
Res物理内存使用量,单位MB
Qrw客户端 等待读的长度队列中的长度 等待写的队列长度
Arw活跃客户 执行写操作的数量 和 等待写的数量
Netinmongodb进入的流量包含mongostat本身(单位:bytes)
Netoutmongodb出去的流量包含mongostat本身
Conn当前连接数
Time时间戳

mongotop 命令

mongotop也是mongodb下的一个内置工具,mongotop提供了一个方法,用来跟踪一个MongoDB的实例,查看哪些大量的时间花费在读取和写入数据。

mongotop提供每个集合的水平的统计数据。默认情况下,mongotop返回值的每一秒。

NsTotalReadwrite
webapp.tasks159ms81ms78ms
admin.system.roles0ms0ms0ms

输出结果字段说明:

  • ns:包含数据库命名空间,后者结合了数据库名称和集合。
  • total:在此命名空间,花费的总时间
  • read: 在此命名空间,执行读操作花费的时间
  • write:在此命名空间,执行写操作花费的时间