Skip to content

Latest commit

 

History

History
360 lines (246 loc) · 10.7 KB

基础.md

File metadata and controls

360 lines (246 loc) · 10.7 KB

基础

区别

对比项 mongoDB mysql
集合(Collection ) table
表的一行数据 文档Document 一条记录record
表字段 键 key 字段 field
字段值 值 value 值value
主外键 pk,fk
灵活度扩展性 极高

基础概念

  1. document :文档是一组键值(key-value)对(即 BSON)。
  2. collections :集合就是 MongoDB 文档组,集合存在于数据库中。
  3. database:数据库。

注意事项

  1. MongDB区分大小写和区分类型

    {"Foo":3} 和 {"foo":3}   	//不是相同的
    {"foo":3} 和 {"foo":"3"} 	//不是相同的
    
  2. 文档键命名规范

    1. 键不能含有\0 (空字符)。这个字符用来表示键的结尾。
    2. . $有特别的意义,只有在特定环境下才能使用。
    3. 以下划线"_"开头的键是保留的(不是严格要求的)。

特殊的 db

admin

这个数据库就是 “ root ” 数据库。如果将一个用户添加到admin数据库,这个用户将自动获取所有数据库的权限。一些特定的服务器端命令也是只能从admin数据运行,列出所有数据库或者关闭服务器。

local

这个数据库永远不可以复制,且一台服务器的所有本地集合都可以存储在这个数据中。可以用来存储限于本地单台服务器的任意集合。

config

MongoDB用于分片设置时。

启动

准备事项

  1. mongodb 在没有参数的情况下会使用默认的数据目录 /data/db 。如果数据目录不存在或者不可写,服务器会启动失败。因此 MongoDB 启动前,先创建数据目录,以确保对该目录有写权限。
  2. 启动时,服务器会打印版本和系统信息,然后等待连接。默认情况下,MongoDB监听27017端口。

配置说明

mongod --help 查看启动详细参数
mongodb的参数说明:  
--dbpath 数据库路径(数据文件)  
--logpath 日志文件路径  
--master 指定为主机器

--slave 指定为从机器  
--source 指定主机器的IP地址  
--pologSize 指定日志文件大小不超过64M.因为resync是非常操作量大且耗时,最好通过设置一个足够大的oplogSize来避免resync(默认的 oplog大小是空闲磁盘大小的5%)。  
--logappend 日志文件末尾添加  
--port 启用端口号   默认 27017 端口
--fork 在后台运行  
--only 指定只复制哪一个数据库  
--slavedelay 指从复制检测的时间间隔  
--auth 是否需要验证权限登录(用户名和密码)

另外备注 :上述配置可以配置到文件中。

启动服务端

./mongodb/mongodb/bin/mongod --dbpath ./mongodb/data/ --logpath ./mongodb/logs/run.log  --fork

启动客户端

默认是用test用户启动mongodb客户端 , 使用超级管理员启动 `mongo 127.0.0.1/admin

关闭

#安全停止使用管理员数据库
	use admin;
	db.shutdownServer();

数据类型

  1. String:字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 

  2. null 用来表示空值或者不存在的字段

    {"key":null}
  3. Boolean 有两个值 true 和 false

    {"key":true}
  4. 正则表达式: 查询时,使用正则表达式作为限定条件,语法也与 Javascript 的正则表达式相同。用于存储正则表达式。

    {"key":/foobar/i}
  5. 数组

    {"key":["a","b","c"]
  6. 内嵌文档 : 文档可嵌套其他文档,被嵌套的文档作为父文档的值

    {"key":{"foo":"bar"}}
  7. 对象id : 是文档的唯一标识

    MongoDB中存储的文档必须有一个 _id 键。这个键的值可以是任何类型的,默认是个ObjectId对象。在一个集合里面,每个文档都有一个唯一的_id

    { "_id" : ObjectId("5b378afa8f979b000c259dba")}
  8. 二进制数据(Binary Data)

    二进制数据是一个任意字节的字符串。它不能直接在shell中使用。如果要将非UTF-8字符保存到数据库中,二进制数据是唯一的方式。

  9. Code:代码类型。用于在文档中存储 JavaScript 代码。

shell

连接数据库

# 进入admin数据库
	mongo 127.0.0.1/admin

#启动 mongo shell 时不连接到任何 mongodb 的方式连接到数据库
	mongo --nodb  								#此时没有连接任何数据库
	conn = new Mongo("127.0.0.1:27017"); 
	db = conn.getDB("admin"); 					#执行完这条命令就可以正常操作shell

执行脚本

  1. 在本地执行 js 脚本

    //mongo shell 会依次执行传入的脚本
    mongo D:/MongoDB3.6/1.js D:/MongoDB3.6/2.js
  2. 在远程执行 js 脚本

    //前提是能连接上
    mongo --quiet server-1:30000/foo scrip t1.js
  3. 可以使用 load() 函数,从交互式 shell 中运行脚本。填写路径的时候尽量填写绝对路径,注意 load() 函数无法理解 ~ 这个代表家目录的符号。

    > load("D:/MongoDB3.6/1.js")
    dddd
    true
  4. shell 中辅助函数对应的 javascript 函数

      shell 中               js 中
    use foo               db.getSisterDB('foo')
    show dbs              db.getMongo().getDBs()
    show collections      db.getCollectonNames()

日志切割

命令行切割

use admin
db.adminCommand({logRotate: 1})

kill 信号切割

ps -ef | grep mongodb #获取mongodb的运行ID
kill -SIGUSR1 2200

配置切割

帮助

  1. 数据库级别的几个函数 (db.help())

    db.hostInfo();   //get details about the server's host
    db.isMaster();   //check replica primary status
    db.version();    //current version of the server
    db.stats();      //查看当前数据库的信息
    db.logout()
  2. 集合级别的帮助 ( db.collections.help())

  3. 如果想知道一个函数是做什么用的。可以直接查看源码如何是实现的。

    db.users.update + tab键
  4. 查看帮助列表 help()

  5. 集合帮助列表 db.<collection>.help() ,例如 db.index.help()

  6. 游标帮助列表。db.<collection>.find().help() ,例如 db.index.find().help()

.mongorc.js文件

当启动的时候,mongo检查用户HOME目录下的一个JavaScript文件.mongorc.js。如果找到,mongo在首次显示提示信息前解析.mongorc.js的内容。如果你使用shell执行一个JavaScript文件或计算表达式,要么通过在命令行使用--eval选项或者指定一个.js文件给mongo,mongo会在完成JavaScript的处理后读取.mongorc.js文件。你可以使用--norc选项来阻止加载.mongorc.js。

  1. 如果某些脚本会被频繁加载,可以将它们添加到.mongorc.js 文件中。这个文件会在启动shell时自动运行。

    • windows 中位于 C:/Administrator/.mongorc.js
    • linux 中位于 对应的家目录。
  2. 可以使用这个脚本创建一些自己需要的全局变量,或者是为太长的名字创建一个简短的别名,也可以重写内置的函数。.mongorc.js 最长见的用途之一就是移除那些比较危险的 shell 辅助函数。可以在这里重写这些方法

    //自定义提示内容
    var no = function(){
        print("Not on my watch");
    };
    //禁止删除数据库
    db.dropDatabase = DB.prototype.dropDatabase = no;
    //禁止删除集合
    DBCollection.prototype.drop = no;
    //禁止删除索引
    DBCollection.prototype.dropIndex = no;

其他

命令

//命令行中根据 ObjectId 获取时间戳
ObjectId("5c8f874fb08d0d6c161b51a3").getTimestamp();
//获取 ObjectId 字符串
ObjectId().str
// getSiblingDB() 相当于 use <database>
db = db.getSiblingDB('users')
db.active.count()

配置 shell

  1. EDITOR变量配置分为两步:

    • 在系统环境变量中[这里建议使用用户目录下的.bashrc文件]添加一个EDITOR变量,变量的值为vim编辑器的路径,默认为/usr/bin/vim,其格式为:EDITOR=/usr/bin/vim 。(source ~/.bashrc 使得环境变量生效)。

    • 在当前的用户目录下新建一个.mongorc.js文件,并为其添添加vim的路径。其格式: EDITOR="/usr/bin/vim" 。这是就可以启动mongo,然后在MongoDB Shell中,直接输入edit 变量名,来编辑相应的变量。

  2. 配置显示的数据条数

    # mognodb 命令行默认显示20行,可以改变一次显示的条数
    	DBQuery.shellBatchSize = 10;
    
  3. 配置提示信息

    //第一种
        prompt = function() {
           return"Uptime:"+db.serverStatus().uptime+"Documents:"+db.stats().objects+" > ";
        }
        //提示信息就变成 Uptime:3331 Documents:0 > 
    //第二种
        //带有行信息的提示
        cmdCount = 1;
        prompt = function() {
            return (cmdCount++) + "> ";
        }
  4. MongoDB默认记录耗时超过100毫秒的查询信息。

    level有三种级别
    0 – 不开启
    1 – 记录慢命令 (默认为>100ms)
    2 – 记录所有命令
    
    参数为1的时候,默认的慢命令是大于100ms,当然也可以进行设置
     db.setProfilingLevel( level , slowms )  实例 db.setProfilingLevel( 1 , 120 );
      db.getProfilingStatus();

固定集合

MongoDB 固定集合(Capped Collections)是性能出色且有着固定大小的集合,对于大小固定,我们可以想象其就像一个环形队列,当集合空间用完后,再插入的元素就会覆盖最初始的头部的元素!

适用场景

  1. 储存日志信息。
  2. 缓存一些少量的文档。

创建

  1. 通过createCollection来创建一个固定集合,且capped选项设置为true:

    db.createCollection("cappedLogCollection",{capped:true,size:10000})
  2. 还可以指定文档个数,加上max:1000属性:

    db.createCollection("cappedLogCollection",{capped:true,size:10000,max:1000})
  3. 判断集合是否为固定集合:

    db.cappedLogCollection.isCapped()
  4. 如果需要将已存在的集合转换为固定集合可以使用以下命令:

    db.runCommand({"convertToCapped":"posts",size:10000})
  5. 固定集合文档按照插入顺序储存的,默认情况下查询就是按照插入顺序返回的,也可以使用$natural调整返回顺序。

    db.cappedLogCollection.find().sort({$natural:-1})