一、搭建
1.拉取镜像
docker pull mongo:5.0.6
2.docker run 创建容器
1) 通过 docker run 命令,不带认证的启动:
docker run -itd --name mongo_1 -p 27017:27017 mongo:5.0.6
进入容器,可以看到实际启动命令,如下:
root@3c612cd232bb:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
mongodb 1 0 6 15:23 pts/0 00:00:00 mongod --bind_ip_all
2) 通过 docker run 命令,带认证的启动:
docker run -d --name mongo_auth_1 -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=123456 -p 27017:27017 mongo:5.0.6
进入容器,可以看到实际启动命令,如下:
root@f8dad368f1af:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
mongodb 1 0 3 15:32 ? 00:00:01 mongod --auth --bind_ip_all
3.docker compose 创建容器
通过 docker compose 启动:
docker-compose.yml 文件
version: '3'
services:
mongo_1:
image: mongo:5.0.6
container_name: mongo_1
restart: always
ports:
- "27017:27017"
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=123456
volumes:
- ./data/db:/data/db
docker compose -f docker-compose.yml up -d
进入容器,可以看到实际启动命令,如下:
root@04a7d3305c5b:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
mongodb 1 0 10 15:34 ? 00:00:01 mongod --auth --bind_ip_all
4.验证
创建需认证的容器,执行命令行操作 mongo:
切换到 admin 数据库,执行 db.auth(user, password) 进行认证
root@04a7d3305c5b:/# mongo
> use admin
switched to db admin
> db.auth("root","123456")
1
> show databases
admin 0.000GB
config 0.000GB
local 0.000GB
> db.person.insert({'name': 'zhang1', 'age': '21'})
WriteResult({ "nInserted" : 1 })
> db.person.find()
{ "_id" : ObjectId("664e118d0992be538002b198"), "name" : "zhang1", "age" : "21" }
二、命令行操作
1.操作数据库
use <database_name>
创建数据库,如果数据库不存在,创建并切换数据库,如果数据库存在,则切换数据库- db.dropDatabase() 删除当前数据库
- show dbs 查看所有数据库
- db 查看当前数据库
1) 创建数据库:
show dbs
显示不出来,需要插入一些数据才能显示
> use test1
switched to db test1
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
> db
test1
> db.person.insert({"id": "1", "name": "zhang1"})
WriteResult({ "nInserted" : 1 })
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
test1 0.000GB
2) 删除数据库:
> db.dropDatabase()
{ "ok" : 1 }
>
> db
test1
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
2.操作集合
- db.createCollection(name, options) 创建集合,name 为要创建的集合名称,options 为可选参数, 指定有关内存大小及索引的选项
db.<collection_name>.drop()
删除集合- show collections 查看当前库下所有集合
- show tables 查看当前库下所有集合
1) 创建集合
在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
> db.person1.insert({"id": "1", "name": "zhang1"})
WriteResult({ "nInserted" : 1 })
> db.createCollection("person2")
{ "ok" : 1 }
> show collections
person1
person2
2) 删除结合
> db.person2.drop()
true
> show collections
person1
3.操作文档
db.<collection_name>.insert(<document>)
插入文档,若插入的数据主键已经存在,则会抛org.springframework.dao.DuplicateKeyException
异常,提示主键重复,不保存当前数据db.<collection_name>.save(<document>)
插入文档,如果_id
主键存在则更新数据,如果不存在就插入数据,该方法新版本中已废弃,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 来代替- db.collection.insertOne() 向指定集合中插入一条文档数据,3.2 版本后支持
- db.collection.insertMany() 向指定集合中插入多条文档数据,3.2 版本后支持
文档的数据结构和 JSON 基本一样。所有存储在集合中的数据都是 BSON 格式。
BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。
1) 插入文档
> db.person1.insertOne({"id": 1, "name": "zhang1"})
{
"acknowledged" : true,
"insertedId" : ObjectId("6655f4dd137e48aaad106e19")
}
>
> db.person1.insertMany([{"id": 2, "name": "zhang2"}, {"id": 3, "name": "zhang3"}])
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("6655f524137e48aaad106e1a"),
ObjectId("6655f524137e48aaad106e1b")
]
}
> db.person1.find()
{ "_id" : ObjectId("6655f4dd137e48aaad106e19"), "id" : 1, "name" : "zhang1" }
{ "_id" : ObjectId("6655f524137e48aaad106e1a"), "id" : 2, "name" : "zhang2" }
{ "_id" : ObjectId("6655f524137e48aaad106e1b"), "id" : 3, "name" : "zhang3" }
2) 一次插入多条文档
> var arr = [];
> for(var i=4 ; i<=6 ; i++){
... arr.push({"id": i, "name": "zhang" + i});
... }
3
> db.person1.insert(arr);
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 3,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
> db.person1.find()
{ "_id" : ObjectId("6655f4dd137e48aaad106e19"), "id" : 1, "name" : "zhang1" }
{ "_id" : ObjectId("6655f524137e48aaad106e1a"), "id" : 2, "name" : "zhang2" }
{ "_id" : ObjectId("6655f524137e48aaad106e1b"), "id" : 3, "name" : "zhang3" }
{ "_id" : ObjectId("6655f5be137e48aaad106e1c"), "id" : 4, "name" : "zhang4" }
{ "_id" : ObjectId("6655f5be137e48aaad106e1d"), "id" : 5, "name" : "zhang5" }
{ "_id" : ObjectId("6655f5be137e48aaad106e1e"), "id" : 6, "name" : "zhang6" }
4.操作用户
- 数据库用户角色:read、readWrite;
- 数据库管理角色:dbAdmin、dbOwner、userAdmin;
- 集群管理角色:clusterAdmin、clusterManager、4. clusterMonitor、hostManage;
- 备份恢复角色:backup、restore;
- 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户角色:root
- 内部角色:__system
1) 查询用户
- show users
- db.system.users.find()
- db.runCommand({usersInfo:"userName"})
> use admin
switched to db admin
> show tables
system.users
system.version
> db.system.users.find()
{ "_id" : "admin.root", "userId" : UUID("bcd616c7-9575-4f5d-b6c5-293b52a86d63"), "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "j+DpH7lpCx4utvTUnQG89A==", "storedKey" : "KsLdLSMaU2mKIkJNk/Ws/tdMLtk=", "serverKey" : "X9YjWIE0ZQ4ePZZSsm3BkyTiHNw=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "CtVOXmQ1rYNGT4/GkK9SFk6U5Zk2zshQeJthLg==", "storedKey" : "q+0T5QYaew4PsLo6MllzoCmwoWshooYUYOVPemBdiP4=", "serverKey" : "KaRflBpCVKqGCW9I4BSneYgqb9j0BhlZH81gNVIL7o8=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
> show users
{
"_id" : "admin.root",
"userId" : UUID("bcd616c7-9575-4f5d-b6c5-293b52a86d63"),
"user" : "root",
"db" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
> db.runCommand({usersInfo:"root"})
{
"users" : [
{
"_id" : "admin.root",
"userId" : UUID("bcd616c7-9575-4f5d-b6c5-293b52a86d63"),
"user" : "root",
"db" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
],
"ok" : 1
}
2) 新增用户
管理员角色 (userAdminAnyDatabase) 包含了 listSessions 角色
db.createUser({
user: "zhang1",
pwd: "123456",
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "dbAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" }
]
})
db.createUser({
user:"zhang2",
pwd:"123456",
customData:{
name:'zhang2',
email:'zhang2@qq.com',
age:18,
},
roles:[
{role:"readWrite",db:"admin"},
{role:"readWrite",db:"config"}
]
})
3) 修改密码
> db.changeUserPassword("zhang1", "123456")
4) 修改密码和用户信息
db.runCommand(
{
updateUser:"zhang2",
pwd:"123456",
customData:{email:"zhang2@qq.com"}
}
)
5) 删除数据库用户
> db.dropUser('zhang1')
true
5.会话
数据库中 system.sessions 集合中存储的所有会话
1) 列出所有会话
- db.system.sessions.aggregate( [ { $listSessions: { allUsers: true } } ] )
> use config
switched to db config
> db.system.sessions.aggregate( [ { $listSessions: { allUsers: true } } ] )
{ "_id" : { "id" : UUID("685472b0-3f5f-4413-a28a-2f7d36d9be5f"), "uid" : BinData(0,"Y5mrDaxi8gv8RmdTsQ+1j7fmkr7JUsabhNmXAheU0fg=") }, "lastUse" : ISODate("2024-08-01T12:29:36.047Z"), "user" : { "name" : "root@admin" } }
2) 列出指定用户的所有会话
- db.system.sessions.aggregate( [ { $listSessions: { users: [ {user: "root", db: "admin" } ] } } ] )
> db.system.sessions.aggregate( [ { $listSessions: { users: [ {user: "root", db: "admin" } ] } } ] )
{ "_id" : { "id" : UUID("685472b0-3f5f-4413-a28a-2f7d36d9be5f"), "uid" : BinData(0,"Y5mrDaxi8gv8RmdTsQ+1j7fmkr7JUsabhNmXAheU0fg=") }, "lastUse" : ISODate("2024-08-01T12:29:36.047Z"), "user" : { "name" : "root@admin" } }
3) 列出当前用户的所有会话
- db.system.sessions.aggregate( [ { $listSessions: { } } ] )
> db.system.sessions.aggregate( [ { $listSessions: { } } ] )
{ "_id" : { "id" : UUID("685472b0-3f5f-4413-a28a-2f7d36d9be5f"), "uid" : BinData(0,"Y5mrDaxi8gv8RmdTsQ+1j7fmkr7JUsabhNmXAheU0fg=") }, "lastUse" : ISODate("2024-08-01T12:29:36.047Z"), "user" : { "name" : "root@admin" } }
6.连接
1) 查询连接数
- db.serverStatus().connections
> db.serverStatus().connections
{
"current" : 4,
"available" : 838856,
"totalCreated" : 4,
"active" : 2,
"threaded" : 4,
"exhaustIsMaster" : 0,
"exhaustHello" : 1,
"awaitingTopologyChanges" : 1
}
2) 查询连接来源
- db.runCommand({currentOp: 1, $all: true}).inprog
> db.runCommand({currentOp: 1, $all: true}).inprog
[
{
"type" : "op",
"host" : "d56ebdb8e7d5:27017",
"desc" : "WaitForMajorityServiceCanceler",
"active" : false,
"currentOpTime" : "2024-08-02T01:20:46.326+00:00"
},
{
"type" : "op",
"host" : "d56ebdb8e7d5:27017",
"desc" : "conn1",
"connectionId" : 1,
"client" : "127.0.0.1:59746",
"appName" : "MongoDB Shell",
"clientMetadata" : {
"application" : {
"name" : "MongoDB Shell"
},
"driver" : {
"name" : "MongoDB Internal Client",
"version" : "5.0.6"
},
"os" : {
"type" : "Linux",
"name" : "Ubuntu",
"architecture" : "x86_64",
"version" : "20.04"
}
},
"active" : true,
"currentOpTime" : "2024-08-02T01:20:46.326+00:00",
"effectiveUsers" : [
{
"user" : "root",
"db" : "admin"
}
],
"threaded" : true,
"opid" : 16669,
"lsid" : {
"id" : UUID("e47cb3ba-41b0-4256-b7ca-c9fa2c3d51dc"),
"uid" : BinData(0,"Y5mrDaxi8gv8RmdTsQ+1j7fmkr7JUsabhNmXAheU0fg=")
},
"secs_running" : NumberLong(0),
"microsecs_running" : NumberLong(144),
"op" : "command",
"ns" : "admin.$cmd.aggregate",
"command" : {
"currentOp" : 1,
"$all" : true,
"lsid" : {
"id" : UUID("e47cb3ba-41b0-4256-b7ca-c9fa2c3d51dc")
},
"$db" : "admin"
},
"numYields" : 0,
"locks" : {
},
"waitingForLock" : false,
"lockStats" : {
},
"waitingForFlowControl" : false,
"flowControlStats" : {
}
},
{
"type" : "op",
"host" : "d56ebdb8e7d5:27017",
"desc" : "conn3",
"connectionId" : 3,
"client" : "172.18.0.1:36714",
"clientMetadata" : {
"driver" : {
"name" : "mongo-java-driver|sync",
"version" : "4.7.1"
},
"os" : {
"type" : "Linux",
"name" : "Linux",
"architecture" : "amd64",
"version" : "5.15.0-105-generic"
},
"platform" : "Java/Private Build/1.8.0_402-8u402-ga-2ubuntu1~20.04-b06"
},
"active" : false,
"currentOpTime" : "2024-08-02T01:20:46.326+00:00",
"threaded" : true
},
{
"type" : "op",
"host" : "d56ebdb8e7d5:27017",
"desc" : "conn2",
"connectionId" : 2,
"client" : "172.18.0.1:36718",
"clientMetadata" : {
"driver" : {
"name" : "mongo-java-driver|sync",
"version" : "4.7.1"
},
"os" : {
"type" : "Linux",
"name" : "Linux",
"architecture" : "amd64",
"version" : "5.15.0-105-generic"
},
"platform" : "Java/Private Build/1.8.0_402-8u402-ga-2ubuntu1~20.04-b06"
},
"active" : true,
"currentOpTime" : "2024-08-02T01:20:46.326+00:00",
"threaded" : true,
"opid" : 16616,
"secs_running" : NumberLong(3),
"microsecs_running" : NumberLong(3960905),
"op" : "command",
"ns" : "admin.$cmd",
"command" : {
"hello" : 1,
"helloOk" : true,
"topologyVersion" : {
"processId" : ObjectId("66ac2f2cc4958385f57b9a74"),
"counter" : NumberLong(0)
},
"maxAwaitTimeMS" : NumberLong(10000),
"$db" : "admin",
"$readPreference" : {
"mode" : "primaryPreferred"
}
},
"numYields" : 0,
"waitingForLatch" : {
"timestamp" : ISODate("2024-08-02T01:20:42.466Z"),
"captureName" : "AnonymousLatch"
},
"locks" : {
},
"waitingForLock" : false,
"lockStats" : {
},
"waitingForFlowControl" : false,
"flowControlStats" : {
}
},
{
"type" : "op",
"host" : "d56ebdb8e7d5:27017",
"desc" : "conn4",
"connectionId" : 4,
"client" : "172.18.0.1:34456",
"clientMetadata" : {
"driver" : {
"name" : "mongo-java-driver|sync",
"version" : "4.7.1"
},
"os" : {
"type" : "Linux",
"name" : "Linux",
"architecture" : "amd64",
"version" : "5.15.0-105-generic"
},
"platform" : "Java/Private Build/1.8.0_402-8u402-ga-2ubuntu1~20.04-b06"
},
"active" : false,
"currentOpTime" : "2024-08-02T01:20:46.326+00:00",
"effectiveUsers" : [
{
"user" : "root",
"db" : "admin"
}
],
"threaded" : true
}
]
三、jdcb 操作
1.mongo-java-driver
pom 依赖:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.12.10</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
测试连接:
@Test
public void testConnection() {
// 方式一,无验证连接
// MongoClient mongoClient = new MongoClient("127.0.0.1",27017);
// 方式二,使用 url,无验证连接
// MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://127.0.0.1:27017"));
// 方式三,验证连接
String database = "admin";
String user = "root";
char[] password = "123456".toCharArray();
MongoCredential credential = MongoCredential.createCredential(user, database, password);
MongoClientOptions options = MongoClientOptions.builder().sslEnabled(false).build();
MongoClient mongoClient = new MongoClient(new ServerAddress("127.0.0.1", 27017), credential, options);
// 方式四,使用 url,验证连接
// MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://root:123456@127.0.0.1:27017/?authSource=admin&ssl=false"));
MongoCursor<String> cursor = mongoClient.listDatabaseNames().cursor();
while (cursor.hasNext()) {
String next = cursor.next();
System.out.println(next);
}
}
2.mongodb-driver-sync
pom 依赖:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.7.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
测试连接:
@Test
public void testConnection() {
String url = "mongodb://root:123456@127.0.0.1:27017";
MongoClientSettings settings = MongoClientSettings.builder()
.applyConnectionString(new ConnectionString(url))
.applyToSocketSettings(builder -> {
builder.connectTimeout(5, TimeUnit.SECONDS);
builder.readTimeout(300, TimeUnit.SECONDS);
})
.build();
com.mongodb.client.MongoClient mongoClient = MongoClients.create(settings);
MongoCursor<String> cursor = mongoClient.listDatabaseNames().cursor();
while (cursor.hasNext()) {
String next = cursor.next();
System.out.println(next);
}
cursor.close();
mongoClient.close();
}