MongoDB学习

MongoDB学习文档

作者 sachinly

MongoDB 简单介绍

MangoDB 是由C++编写的分布式文件存储的开源数据库系统。在高负载情况下,可以添加更多的节点,从而保证服务器的性能。

MongoDB主要特点

  • 面向文档存储的数据库,操作起来比较方便和容易
  • 可以在记录中设置任何属性的索引来实现更快的排序
  • 可以通过本地和网络创建数据镜像,具有很强的可扩展性
  • 如果处理能力和存储空间受到限制,可以分布到其他网络节点上
  • 支持丰富的查询表达式。查询指令使用json形式的标记,可以轻易查询到内嵌的对象和数组。
  • 使用update()命令替换已经完成的文档或数据,也可以更新部分字段的数据
  • Map/Reduce是使用Javascript编写,用来对数据的进行批量处理和聚合操作
  • GridFS是MongoDB的内置功能,可以用来存放大量小文件
  • MongoDB 服务端支持自定义JS脚本执行,并可以存储JS脚本以方便调用
  • MongoDB Client 支持多种语言:Java、Ruby、Python、C++、PHP和JS等10多种编程语言
  • MongoDB 安装部署简单

MongoDB Linux 安装

  1. Ubuntu 在线安装
  • 添加公钥

wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -

  • 添加安装源

echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list

  • 更新

sudo apt-get update

  • 安装mongoDB

sudo apt-get install mongodb-org

  1. 离线安装
  • 下载

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1804-4.2.6.tgz

  • 依赖库安装

sudo apt-get install libcurl4 openssl

  • 解压安装

tar -zxvf mongodb-linux-x86_64-ubuntu1804-4.2.6.tgz
sudo cp mongodb-linux-x86_64-ubuntu1804-4.2.6/bin/* /usr/local/bin/

  • 手动创建文件夹

sudo mkdir -p /var/lib/mong
sudo mkdir -p /var/log/mongodb
sudo chown whoami /var/lib/mongo # Or substitute another user
sudo chown whoami /var/log/mongodb # Or substitute another user

  • 配置文件

sudo touch /etc/mongos.conf

在配置文件`/etc/mongos.conf`添加如下内容

      # Where and how to store data.
      storage:
        dbPath: /var/lib/mongodb
        journal:
          enabled: true
      #  engine:
      #  mmapv1:
      #  wiredTiger:

      # where to write logging data.
      systemLog:
        destination: file
        logAppend: true
        path: /var/log/mongodb/mongod.log

      # network interfaces
      net:
        port: 27017
        bindIp: 127.0.0.1

      # how the process runs
      processManagement:
        timeZoneInfo: /usr/share/zoneinfo
  1. 控制和自启动
  • 启动

sudo systemctl start mongod

  • 停止

sudo systemctl stop mongod

  • 状态

sudo systemctl status mongod

  • 自启动

sudo systemctl enable mongod

  1. 测试

mongo

如下显示

    MongoDB shell version v4.2.6
    connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
    Implicit session: session { "id" : UUID("dfa3b6d1-43e4-4555-a6a7-015415baeaca") }
    MongoDB server version: 4.2.6
    Server has startup warnings:
    2020-05-18T10:01:52.767+0800 I  STORAGE  [initandlisten]
    2020-05-18T10:01:52.767+0800 I  STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
    2020-05-18T10:01:52.767+0800 I  STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
    2020-05-18T10:01:53.922+0800 I  CONTROL  [initandlisten]
    2020-05-18T10:01:53.923+0800 I  CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
    2020-05-18T10:01:53.923+0800 I  CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
    2020-05-18T10:01:53.923+0800 I  CONTROL  [initandlisten]
    ---
    Enable MongoDB's free cloud-based monitoring service, which will then receive and display
    metrics about your deployment (disk utilization, CPU, operation statistics, etc).

    The monitoring data will be available on a MongoDB website with a unique URL accessible to you
    and anyone you share the URL with. MongoDB may use this information to make product
    improvements and to suggest MongoDB products and deployment options to you.
    To enable free monitoring, run the following command: db.enableFreeMonitoring()
    To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
    ---

    > show dbs
    admin   0.000GB
    config  0.000GB
    local   0.000GB
  1. 卸载
  • 停止服务

sudo service mongod stop

  • 卸载

sudo apt-get purge mongodb-org*

  • 删除数据和配置文件

sudo rm -r /var/log/mongodb
sudo rm -r /var/lib/mongodb
sudo rm /etc/mongos.conf

MongoDB 概念解析

在任何服务或者软件中首先要了解其概念名词术语

SQL术语 MongoDB术语 解释说明
database database 数据库/数据库
table collections 表/集合
row document 数据记录/文档
column field 数据字段/域
index index 索引/索引
table join —— 表连接/mongoDB不支持
primary key primary key 主键/mongoDB自动将_id域作为索引
  1. 数据库
    MongoDB 可创建多个独立的数据库,admin local config 是系统默认保留的数据库。数据库名最大支持64个字符,应全部小写。

  2. 集合
    MongoDB中的文档相当于关系型数据库的表。集合存于数据库中,集合没有固定的结构,意味着可以插入不同格式不同类型的数据,通常情况下集合中的数据是有一定的关联性。当文档数据插入数据库时,集合就会被创建。集合名称不能以'system'开头,system是系统集合保留的前缀名。

  3. 文档
    文档是一组键值对,MongoDB的文档不需要设置相同的字段,并且相同的字段不需要相同的类型。这是与关系型数据库最大的区别,也是mongoDB的突出特点。

  4. 数据类型如下表

类型 描述
String 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
Integer 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。
Boolean 布尔值。用于存储布尔值(真/假)。
Double 双精度浮点值。用于存储浮点值。
Min/Max keys 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
Array 用于将数组或列表或多个值存储为一个键。
Timestamp 时间戳。记录文档修改或添加的具体时间。
Object 用于内嵌文档。
Null 用于创建空值。
Symbol 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
Date 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
Object ID 对象 ID。用于创建文档的 ID。
Binary Data 二进制数据。用于存储二进制数据。
Code 代码类型。用于在文档中存储 JavaScript 代码。
Regular expression 正则表达式类型。用于存储正则表达式。

MongoDB远程连接配置

  1. 添加管理员用户

mongo

      > use admin
      > db.createUser(
        {         
          user: "admin",
          pwd: "Admin@123",
          roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
        }
      )

Mongodb 内置角色介绍

数据库用户角色  
  - read: 只读数据权限
  - readWrite:读写数据权限
数据库管理角色  
  - dbAdmin: 在当前db中执行管理操作的权限
  - dbOwner: 在当前db中执行任意操作
  - userADmin: 在当前db中管理user的权限
备份和还原角色   
  - backup
  - restore
夸库角色  
  - readAnyDatabase: 在所有数据库上都有读取数据的权限
  - readWriteAnyDatabase: 在所有数据库上都有读写数据的权限
  - userAdminAnyDatabase: 在所有数据库上都有管理user的权限
  - dbAdminAnyDatabase: 管理所有数据库的权限
集群管理  
  - clusterAdmin: 管理机器的最高权限
  - clusterManager: 管理和监控集群的权限
  - clusterMonitor: 监控集群的权限
  - hostManager: 管理Server
超级权限  
  - root: 超级用户
  1. 数据库添加用户

    mongo

          > use dbname
          > db.createUser(
            {         
              user: "dbuser",
              pwd: "dbuser@123",
              roles: [ { role: "readWrite", db: "dbname" } ]
            }
          )
    
  2. 修改配置文件

vim /etc/mongod.conf

  ```
      storage:
        dbPath: /var/lib/mongodb
        journal:
          enabled: true
      #  engine:
      #  mmapv1:
      #  wiredTiger:
      systemLog:
        destination: file
        logAppend: true
        path: /var/log/mongodb/mongod.log
      net:
        port: 27017
        bindIp: 127.0.0.1
      processManagement:
        timeZoneInfo: /usr/share/zoneinfo
      security:
        authorization: enabled
      #operationProfiling:
      #replication:
      #sharding:
      ## Enterprise-Only Options:
      #auditLog:
      #snmp:
  ```
  修改`security` 标签下的`authorization` 为`enabled` 即开启认证。然后重启服务
  修改`net` 标签下的`port` 端口和`bindIp`地址,允许远程访问修改为`0.0.0.0` 本地访问`127.0.0.1`
  1. 删除用户

首先修改配置文件,即注释掉 security 下的authorization 然后重启

mongo

    > use dbname
    > db.dropUser("dbuser")

MongoDB客户端连接

使用用户名和密码连接到远程的指定数据库上
mongodb://username:password@host/dbname
分布式的在其他章节介绍

python3 连接 MongoDB Server

pip3 install pymongo

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://dbuser:dbuser@123@127.0.0.1/dbname")
mycol = myclient["col_test"]

MongoDB 数据库、文档、集合的创建删除

  1. 数据库
  • 创建数据库

use dbname #如果数据库不存在则创建,如果数据库存在则切换到该数据库。
show dbs #列出所有数据库,只有数据库有内容数据库才会被真正的创建,如果是空数据库要想被显示,则需要插入数据。
db.dbcol.insert({"key":"value"}) #自动创建集合dbcol 并插入数据

  • 删除数据库

use dbname
db.dropDatabase()

若数据库中没有集合没有数据,数据库会自动删除

  1. 集合
  • 创建集合

db.createCollection(colname, options)

`colname`是集合名称,`options`是选项
  • 删除集合

db.colname.drop()

show collections 可列出当前数据库下所有的集合colname是集合名称
options 说明

字段 类型 描述
capped Boolean 是否创建固定集合,如果是必须指定固定集合大小size
autoIndexId Boolean 是否自动在_id 上创建索引,默认是false
size Integer 固定集合指定的最大值,单位是KB
max Integer 固定集合的文档的最大数量

插入文档时,MongoDB先检查size 然后检查max,若达到最大值,新插入的就会覆盖最旧的文档

  1. 文档
    文档的数据结构和JSON基本一样,所有存储在集合的数据都是BSON格式,BSON就是Binary Json
  • 插入文档

db.COLLECTION_NAME.insert(document)

db.collection.insertOne()db.collection.insertMany()分别是一次插入一个和多个

db.colname.insert({
  "title":"mogo",
  "msg":{"aa","bbb"}
  })
  • 删除文档

    db.COLLECTION_NAME.remove(DELECTION_CRITERIA)

    DELECTION_CRITERIA为删除条件

db.colname.remove({"title":"mogo"})

此处的{"title":"mogo"}是查询条件

  • 更新文档

    MongoDB文档更新有update()save()两个方法

    db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA,{multi:true})

    SELECTION_CRITERIA是查询条件 UPDATED_DATA是更新的数据

    db.colname.update({"title":"mogo"},{$set:{
     "title":"MongoDB title",
     "msg":{"aa":"cccc"}
     }},{multi:false})
    

    若查询结果有多个满足条件,multi:true 决定是否全部更新。

    db.COLLECTION_NAME.save({_id:ObjectId(), NEW_DATA})

    _id内容存在则update,若不存在则插入。

  • 查询文档

    db.collection.find(query, projection)

    query 为查询条件,projection返回数据指定键,默认全部返回

    db.col.find().pretty()

    pretty()格式化输出查询内容,若将find()替换为findOne()则返回一个内容

    AND条件

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

    OR条件

    db.col.find({ $or: [ {key1: value1}, {key2:value2}]}).pretty()

    操作运算符

操作符 格式 范例 RDBMS类似的语句
等于 {key:value} db.col.find({"ti":"mogo"}).pretty() where ti = 'mogo'
小于 {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

===
后面还会继续介绍关于查询的内容

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342