2020-02-13
Mongodb
MongoDB 是由C++语言编写的, 是一个基于分布式文件存储的开源数据库系统;
在高负载的情况下, 添加更多的节点, 可以保证服务器性能;
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案;
MongoDB 将数据存储为一个文档, 数据结构由键值(key⇒value)对组成;MongoDB 文档类似于 JSON 对象;字段值可以包含其他文档, 数组及文档数组;
software → community server 下载页 官方文档
安装 for linux
选RHEL 7.0 Linux 64-bit x64 Package 选TGZ 压缩包
解压
执行./bin/mongo
MongoDB的数据存储在data目录的db目录下, 但是这个目录在安装过程不会自动创建, 所以你需要手动创建data目录, 并在data目录中创建db目录;
以下实例中我们将data目录创建于根目录下(/);
注意: /data/db 是 MongoDB 默认的启动的数据库路径(—dbpath);
mkdir -p data/db
配置文件
默认配置文件位置
On Linux, a default /etc/mongod.conf configuration file is included when using a package manager to install MongoDB.
On Windows, a default <install directory>/bin/mongod.cfg configuration file is included during the installation.
On macOS, a default /usr/local/etc/mongod.conf configuration file is included when installing from MongoDB’s official Homebrew tap.
概念/对应关系数据库
| SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
|---|---|---|
| database | database | 数据库 |
| table | collection | 数据库表/集合 |
| row | document | 数据记录行/文档 |
| column | field | 数据字段/域 |
| index | index | 索引 |
| tablejoins | - | 表连接, MongoDB不支持 |
| primarykey | primarykey | 主键, MongoDB自动将_id字段设置为主键 |
数据库
MongoDB的默认数据库为”db”, 该数据库存储在data目录中;
MongoDB的单个实例可以容纳多个独立的数据库, 每一个都有自己的集合和权限, 不同的数据库也放置在不同的文件中;
show dbs 命令可以显示所有数据的列表;
“use”命令, 可以连接到一个指定的数据库;
有一些数据库名是保留的, 可以直接访问这些有特殊作用的数据库;
admin: 从权限的角度来看, 这是”root”数据库; 要是将一个用户添加到这个数据库, 这个用户自动继承所有数据库的权限; 一些特定的服务器端命令也只能从这个数据库运行, 比如列出所有的数据库或者关闭服务器;
local: 这个数据永远不会被复制, 可以用来存储限于本地单台服务器的任意集合
config: 当Mongo用于分片设置时, config数据库在内部使用, 用于保存分片的相关信息
集合
集合就是 MongoDB 文档组, 类似于 RDBMS (关系数据库管理系统: Relational Database Management System)中的表格;
集合存在于数据库中, 集合没有固定的结构, 这意味着你在对集合可以插入不同格式和类型的数据, 但通常情况下我们插入集合的数据都会有一定的关联性;
db.createCollection("collection_name")//创建集合
db.[collection_name].drop() //删除集合
文档(Document)
文档是一组键值(key-value)对(即 BSON); MongoDB 的文档不需要设置相同的字段, 并且相同的字段不需要相同的数据类型, 这与关系型数据库有很大的区别, 也是 MongoDB 非常突出的特点;
需要注意的是:
文档中的键/值对是有序的; 文档中的值不仅可以是在双引号里面的字符串, 还可以是其他几种数据类型(甚至可以是整个嵌入的文档); MongoDB区分类型和大小写; MongoDB的文档不能有重复的键; 文档的键是字符串; 除了少数例外情况, 键可以使用任意UTF-8字符;
文档键命名规范:
键不能含有\0 (空字符); 这个字符用来表示键的结尾; .和$有特别的意义, 只有在特定环境下才能使用; 以下划线”_“开头的键是保留的(不是严格要求的)
元数据
数据库的信息是存储在集合中; 它们使用了系统的命名空间:
dbname.system.*
在MongoDB数据库中名字空间<dbname>.system.*是包含多种系统信息的特殊集合(Collection), 如下:
| 集合命名空间 | 描述 |
|---|---|
| dbname.system.namespaces | 列出所有名字空间; |
| dbname.system.indexes | 列出所有索引; |
| dbname.system.profile | 包含数据库概要(profile)信息; |
| dbname.system.users | 列出所有可访问数据库的用户; |
| dbname.local.sources | 包含复制对端(slave)的服务器信息和状态; |
对于修改系统集合中的对象有如下限制;
在{{system.indexes}}插入数据, 可以创建索引; 但除此之外该表信息是不可变的(特殊的drop index命令将自动更新相关信息); {{system.users}}是可修改的; {{system.profile}}是可删除的;
MongoDB CRUD Operations 文档(表)操作
C - create-operations
Create or insert operations add new documents to a collection. If the collection does not currently exist, insert operations will create the collection.
(https://docs.mongodb.com/manual/crud/#create-operations)
db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
db.inventory.insertMany([
{ item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
{ item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
{ item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } }
])db.collection.insertMany() New in version 3.2.
R - query-documents
db.COLLECTION_NAME.find(query, projection) //查询
等于 db.col.find({“by”:“菜鸟教程”}).pretty() where by = ‘菜鸟教程’ 小于 db.col.find({“likes”:{lt:50}}).pretty() where likes < 50 小于或等于 db.col.find({"likes":{lte:50}}).pretty() where likes ⇐ 50 大于 db.col.find({“likes”:{gt:50}}).pretty() where likes > 50 大于或等于 db.col.find({"likes":{gte:50}}).pretty() where likes >= 50 不等于 db.col.find({“likes”:{$ne:50}}).pretty() where likes != 50
and
db.inventory.find( { status: "A", qty: { $lt: 30 } } )
The operation corresponds to the following SQL statement:
SELECT * FROM inventory WHERE status = “A” AND qty < 30
or
db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )
The operation corresponds to the following SQL statement:
SELECT * FROM inventory WHERE status = “A” OR qty < 30
and or
db.inventory.find( {
status: "A",
$or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} )The operation corresponds to the following SQL statement:
SELECT * FROM inventory WHERE status = “A” AND ( qty < 30 OR item LIKE “p%”)
(https://www.runoob.com/mongodb/mongodb-query.html)
U - update-operations
(https://docs.mongodb.com/manual/crud/#update-operations)
db.col.save({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})以上实例中 col 是我们的集合名, 如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档;
你也可以使用 db.col.save(document) 命令; 如果不指定 _id 字段 save() 方法类似于 insert() 方法;如果指定 _id 字段, 则会更新该 _id 的数据;
db.collection.updateOne() New in version 3.2
db.collection.updateMany() New in version 3.2
db.collection.replaceOne() New in version 3.2
D - delete-operations
(https://docs.mongodb.com/manual/crud/#delete-operations)
You can specify criteria, or filters, that identify the documents to remove. These filters use the same syntax as read operations.
db.users.deleteMany(
{status: "reject"}
)
db.collection.deleteOne() New in version 3.2
db.collection.deleteMany() New in version 3.2
如果你只想删除第一条找到的记录可以设置 justOne 为 1, 如下所示:
db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
db.iot_data.deleteMany( {system_response_time:{$lt:new Date(“2021-12-01T00:00:00.000+00:00”)}} )
db.iot_sensor_data.deleteMany( {time:{$lt:new Date(“2021-12-01T00:00:00.000+00:00”)}} )
aggregation
TODO aggregation
用户认证
默认是无用户认证的
use iot_db
db.createUser({ user:'user_dev', pwd:'abc123.com', roles:[ {role:'dbOwner',db:'iot_db'} ] })
Built-In Roles(内置角色)
dbOwner 基本上是最大权限了
//shell 连接认证
./mongo --host 192.168.1.143 --port 27017 -u "user_dev" -p "abc123.com" --authenticationDatabase "iot_db"
./mongo “mongodb://alice@192.168.1.143:27017/?authSource=admin”
You can use the --username <user> and --password, --authenticationDatabase <db> command-line options. For example, to connect and authenticate to a remote MongoDB instance as user alice:
管理工具
Mongo Shell
./mongo --help
usage: ./mongo [options] [db address] [file names (ending in .js)]
foo foo database on local machine
192.168.0.5/foo foo database on 192.168.0.5 machine
192.168.0.5:9999/foo foo database on 192.168.0.5 machine on port 9999
mongodb://192.168.0.5:9999/foo connection string URI can also be used
Options:
--ipv6 enable IPv6 support (disabled by
default)
--host arg server to connect to
...
认证连接
mongo "mongodb://192.168.1.143:27017/?authSource=admin"
连接后认证 use iot_db db.auth(‘user_dev’,‘abc123.com’)
(https://docs.mongodb.com/v4.0/mongo/)
mongo “mongodb://user_dev:abc123.com@192.168.30.171:27017/?authSource=iot_db”
MongoDB Compass
Easily explore and manipulate your database with Compass, the GUI for MongoDB. Intuitive and flexible, Compass provides detailed schema visualizations, real-time performance metrics, sophisticated querying abilities, and much more.
官方提供的一个 GUI工具
mongodb://user_dev:abc123.com@192.168.30.171:27017/?authSource=iot_db
备份/恢复
mongodb数据备份和恢复主要分为二种: 一种是针对库的, 使用 mongodump 和mongorestore工具; 一种是针对库中表的 使用mongoexport和mongoimport 工具;
备份库
使用mongod的 mongodump 命令行工具
//导出
.\mongodump -h 192.168.10.82 --port 27017 -d iot_db -o F:/mongodb-nterprise-windows-64-4.2.3/mongodb_dump/
//导出并 压缩备份
./mongodump --host 192.168.1.143 --port 27017 -u user_dev -p "abc123.com" --gzip --authenticationDatabase "iot_db" --out /mnt/data/mgdb_dump/mongodb_back.gz
h: MongDB所在服务器地址, 例如: 127.0.0.1, 当然也可以指定端口号: 127.0.0.1:27017
-d: 需要备份的数据库实例, 例如: test
-o: 备份的数据存放位置, 例如: c:\data\dump, 当然该目录需要提前建立, 在备份完成后, 系统自动在dump目录下建立一个test目录, 这个目录里面存放该数据库实例的备份数据;
./mongoexport -h 172.128.111.56 —port 27017 -u admin -p admin -d test_db -c test_collection —type=csv -f uploadDate,length,filename -q ’{“uploadDate”:{“gt”:new Date(“2019-12-01T16:00:00.000Z”)}}’ -o /home/test/mongodb/test_20191202.csv
恢复库
使用mongod的 mongorestore 命令行工具
//恢复
./mongorestore --dir /home/jk-nyy/iot_db --db iot_db
db.iot_data.findOne({}) .projection({}) .sort({_id:-1}) .limit(2)
//恢复 从压缩的备份文件
./mongorestore --host 192.168.30.171 --port 27017 -d iot_db -u user_dev -p "abc123.com" --gzip --authenticationDatabase "iot_db" D:/share/iot_db
OR
mongorestore --gzip --dir D:/share/iot_db --db iot_db
--host <:port>, -h <:port>:
MongoDB所在服务器地址, 默认为: localhost:27017
--db , -d:
需要恢复的数据库实例, 例如: test, 这个名称也可以和备份时候的不一样, 比如test2
--drop:
恢复的时候, 先删除当前数据, 然后恢复备份的数据; 就是说, 恢复后, 备份后添加修改的数据都会被删除, 慎用哦!
<path>:
mongorestore 最后的一个参数, 设置备份数据所在位置, 例如: c:\data\dump\test;
你不能同时指定 <path> 和 —dir 选项, —dir也可以设置备份目录;
--dir:
指定备份的目录
你不能同时指定 <path> 和 —dir 选项
恢复后用户认证失败问题
- 配置文件 设置
enableLocalhostAuthBypass为false
setParameter:
enableLocalhostAuthBypass: false
-
无认证启动
./mongod -f /mnt/data/mongodb/mongod_cnf.yml -
切换对应的数据库 登陆shell
use ${your db} show users
- 添加用户认证
use iot_db
db.createUser({ user:'user_dev', pwd:'abc123.com', roles:[ {role:'dbOwner',db:'iot_db'} ] })
导出集合
mongoexport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 -f 字段 -q 条件导出 -o 文件名
mongoexport —host 192.168.30.171 —port 27017 -u user_dev -p “abc123.com” -d iot_db -c iot_data -q ‘{system_response_time:{$gt:new Date(“2021-06-01”)}}’ -o “d:/iot_db.iot_data_part.json”
在win上, 使用日期条件会有too many positional arguments的错误, 官方例子也会错误..
mongoexport --host=192.168.30.171 --port=27017 -u=user_dev -p="abc123.com" -d=iot_db -c=iot_data -q='{"system_response_time":{"$gt": { "$date": "2021-06-01T00:00:00.000Z"}}}' -o="d:/iot_db.iot_data_part.json"
-h,—host: 代表远程连接的数据库地址, 默认连接本地Mongo数据库; —port: 代表远程连接的数据库的端口, 默认连接的远程端口27017; -u,—username: 代表连接远程数据库的账号, 如果设置数据库的认证, 需要指定用户账号; -p,—password: 代表连接数据库的账号对应的密码; -d,—db: 代表连接的数据库; -c,—collection: 代表连接数据库中的集合; -f, —fields: 代表集合中的字段, 可以根据设置选择导出的字段; —type: 代表导出输出的文件类型, 包括csv和json,tsv文件, 默认json格式; -o, —out: 代表导出的文件名; -q, —query: 代表查询条件; —skip: 跳过指定数量的数据; —limit: 读取指定数量的数据记录; —sort: 对数据进行排序, 可以通过参数指定排序的字段, 并使用 1 和 -1 来指定排序的方式, 其中 1 为升序排列, 而-1是用于降序排列,如sort({KEY:1});
导入集合
恢复整表导出的非csv文件
mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --upsert --drop 文件名
mongoimport —host 192.168.30.171 —port 27017 -u user_dev -p “abc123.com” -d iot_db -c iot_data —upsert —drop d:/iot_db.iot_data_part.json
恢复导出的文件 指定类型
mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --type 类型 --headerline --upsert --drop 文件名
h,—host: 代表远程连接的数据库地址, 默认连接本地Mongo数据库; —port: 代表远程连接的数据库的端口, 默认连接的远程端口27017; -u,—username: 代表连接远程数据库的账号, 如果设置数据库的认证, 需要指定用户账号; -p,—password: 代表连接数据库的账号对应的密码; -d,—db: 代表连接的数据库; -c,—collection: 代表连接数据库中的集合; -f, —fields: 代表导入集合中的字段; —type: 代表导入的文件类型, 包括csv和json,tsv文件, 默认json格式; —file: 导入的文件名称 —headerline: 导入csv文件时, 指明第一行是列名, 不需要导入;
启动/关闭
./mongod --auth
关闭
./mongod --shutdown
./mongod --shutdown --dbpath=/mnt/data/mongodbdata/db