MongDB常用操作
<svg xmlns="http://www.w3.org/2000/svg" style="display: none">
<path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)"></path>
</svg>
<h2 id="blogTitle0"><a id="MongDB_0"></a>MongDB常用操作<button class="cnblogs-toc-button" title="显示目录导航" aria-expanded="false"></button></h2>
MongoDB 安装
-
mac 安装
brew search mongodb # 查询能安装的版本
brew install mongodb-community@4.2 # 安装4.2版本的mongodb
-
ubuntu 安装
apt-get install mongodb
配置
-
mac 配置
systemLog: destination: file # 日志路径 path: /usr/local/var/log/mongodb/mongo.log logAppend: true storage: # 存储路径 dbPath: /usr/local/var/mongodb net: bindIp: 127.0.0.1
-
ubuntu 配置
# 存储 storage: dbPath: /var/lib/mongodb journal: enabled: true # 日志 systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log
ip 和 端口
net:
port: 27017
bindIp: 127.0.0.1安全设置
security:
authorization: enabled
基本概念
-
在 mongodb 中通过数据库、集合、文档的方式来管理数据, 下边是 mongodb 与关系数据库的一些概念对比:
SQL 术语 / 概念 MongoDB 术语 / 概念 解释 / 说明 database database 数据库 table collection 数据库表 / 集合 row document 数据记录行 / 文档 column field 数据字段 / 域 index index 索引 table joins 表链接 (MongoDB 不支持) primary key primary key 主键, MongoDB 自动在每个集合中添加 _id 的主键 -
一个 mongodb 实例可以创建多个数据库
-
一个数据库可以创建多个集合
-
一个集合可以包括多个文档
启动 mongodb 服务
-
mac 启动服务
mongod --fork -f ./mongod.conf
-
ubuntu 启动服务
sudo mongod --fork -f ./mongod.conf
-
访问 127.0.0.1:27017, 显示如下表示运行成功
链接 mongodb
mongodb 的使用方式是客户服务器模式, 即使用一个客户端连接 mongodb 数据库 (服务端).
1、命令格式
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
mongodb:// 固定前缀
username : 账号, 可不填
password : 密码, 可不填
host : 主机名或 ip 地址, 只有 host 主机名为必填项
port : 端口, 可不填, 默认 27017
/database : 链接某个数据库
?options : 链接参数, key/value 对
例子:
mongodb://localhost 链接本地数据库27017端口
mongodb://root:xiaoge@localhost 使用用户名root密码为xiaoge链接本地数据库27017端口
mongodb://localhost,localhost:27018,localhost:27019 链接三台主从服务器, 端口为27017、27018、27019
2、使用 mongodb 自带的 JavaScript shell (mongo) 链接
mac 版本的 MongoDB 安装成功, 在 /usr/local/bin 目录下有 mongo 客户端命令
ubuntu 版本的 MongoDB 安装成功, 在 /usr/bin 目录下有 mongo 客户端命令
3、使用 java 程序连接
详细参数: http://mongodb.github.io/mongo-java-driver/3.4/driver/tutorials/connect-to-mongodb/
添加依赖:
<dependency>
<groupId>org-mongod</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.4.3</version>
</dependency>
测试程序
@Test
public void testConnection() {
// 创建 mongodb 客户端
MongoClient mongoClient = new MongoClient("localhost", 27017);
// 或者采用连接字符串
// MongoClientURI connectionString = new MongoClientURI("mongodb://root:root@localhost:27017");
// MongoClient mongoClient = new MongoClient(connectionString);
// 连接数据库
MongoDatabase database = mongoClient.getDatabase("test");
// 连接 collection
MongoCollection<Document> collection = database.getCollection("status");
// 查询第一个文档
Document myDoc = collection.find().first();
// 得到文件内容 json 串
String json = myDoc.toJson();
System.out.println(json);
}
关闭 mongodb
-
mac 关闭
use admin db.shutdownServer();
-
ubuntu 关闭
use admin db.shutdownServer();
数据库
-
查询数据库
show dbs --查询全部数据库
db --显示当前数据库
-
创建数据库
命令格式:
use DATABASE_NAME
例子:
use test02
有 test02 数据库则切换到此数据库, 没有则创建.
注意:
新创建的数据库不显示, 需要至少包括一个集合.
-
删除数据库 (慎用!!!)
命令格式:
db.dropDatabase()
例子:
删除 test02 数据库
先切换数据库: use test02
集合
集合相当于关系数据库中的表, 一个数据库可以创建多个集合, 一个集合是将相同类型的文档管理起来.
1、创建集合
db.createCollection(name, options)
name: 新创建的集合名词
options: 创建参数
列子:
db.createCollection("student") --options可以省略
2、删除集合
db.collection.drop()
例子:
db.student.drop() --删除student集合
文档
-
插入文档
mongodb 中文档的格式是 json 格式, 下边就是一个文档, 包括两个 key: _id 主键和 name
{ "_id": ObjectId("5b2cc4bfa6a44812707739b5"), "name": "啸哥" }
插入命令:
db.COLLECTION_NAME.insert(document)
每个文档默认与 _id 作为主键, 主键默认类型为 ObjectId(对象类型), mongodb 会自动生成主键值.
例子:
db.student.insert({"name": "啸哥", "age": 10})
注意: 同一个集合中的文档的 key 可以不相同! 但是建议设置为相同的.
-
更新文档
命令格式:
db.collection.update( <query>, <update>, <options> )
query: 查询条件, 相当于sql语句的where
update: 更新文档内容
options: 选项1、替换文档
将符合条件 "name":"啸哥" 的第一个文档替换为 {“name”: “啸哥 1”, “age”:10}.
db.student.update({"name":"啸哥"}, {"name":"啸哥1", "age":10})
2、$set 修改器
使用 $set 修饰器指定更新的 key, key 不存在则创建, 存在则更新.
将符合条件 "name":"啸哥" 的所有文档更新 name 和 age 值.
db.student.update({"name":"啸哥"}, {$set:{"name":"啸哥1", "age":10}},{multi:true})
multi: false 表示更新第一个匹配的文档, true 表示更新所有匹配的文档.
-
删除文档
命令格式:
db.student.remove(<query>)
query: 删除条件, 相当于sql语句中的where1、删除所有文档
db.student.remove({})
2、删除符合条件的文档
db.student.remove({"name":"啸哥"})
-
查询文档
命令格式:
db.collection.find(query, projection)
query: 查询条件, 可不填
projection: 投影查询key, 可不填1、查询全部
db.student.find()
2、查询符合条件的记录
查询 name 等于 "啸哥" 的文档.
db.student.find({"name":"啸哥"})
3、投影查询
只显示 name 和 age 两个 key, _id 主键不显示
db.student.find({"name":"啸哥"},{name:1,age:1,_id:0})
用户
-
创建用户
语法格式:
mongo>db.createUser( {user: "<name>", pwd: "<cleartext password>", customData: { <any infomation> }, roles: [ { role: "<role>", db: "<database>" } | "<role>", .... ]} )
例子:
创建 root 用户, 角色为 root
use admin db.createUser( { user: "root", pwd: "123", roles:[{role:"root",db:"admin"}] } )
内置角色如下:
1、数据库用户角色: read、readWrite;
2、数据库管理角色: dbAdmin、dbOwner、userAdmin;
3、集群管理角色: clusterAdmin、clusterManager、clusterMonitor、hostManager;
4、备份恢复角色: backup、restore;
5、所有数据库角色: readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6、超级用户角色: root
-
认证登入
为了安全需要, MongoDB 要打开认证开关, 即用户连接 MongoDB 要进行认证, 其中就可以通过账号密码方式进行认证.
1、在 mongod.conf 中设置
# 启用认证 security: authorization: enabled
2、重启 MongoDB
3、使用账号和密码连接数据库
1 )mongo 连接
mongo -u root -p 123 --authenticationDatabase admin --指定用户名-密码-认证的数据库
2 )Studio 3T 连接
-
查询用户
查询当前库下的所有用户:
show users
-
删除用户
语法格式:
db.dropUser("用户名")
例子:
删除 root1 用户
db.dropUser(“root1”)
-
修改用户
语法格式:
db.updateUser( "<username>", { customData: { <any information> }, roles : [ { role: "<role>", db: "<database>" } | "<role>", ... ], pwd: "<cleartext password>" }, writeConcern: { <write concern> } )
例子:
先创建 test1 用户:
use admin db.createUser( { user: "test1", pwd: "123", roles:[{role:"root",db:"admin"}] } )
修改 test1 用户的角色为 readWriteAnyDatabase
use admin db.updateUser("test1", {roles:[{role:"readWriteAnyDatabase", db:"admin"}]})
-
修改密码
语法格式:
db.changeUserPassword("username","newPassword")
例子:
修改 root 用户的密码为 123
use admin db.changeUserPassword("root", "123")