1. 程式人生 > 其它 >Java反射之反射許可權和靜態屬性的賦值

Java反射之反射許可權和靜態屬性的賦值

MongoDB

官方文件:https://docs.mongodb.com/v3.6/
基本介紹:
    MongoDB 是由C++語言編寫並基於分散式檔案儲存的開源資料庫系統,是一款介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的NOSQL資料庫。它面向文件儲存,而且安裝和操作起來都比較簡單和容易,而且它支援各種流行程式語言進行操作,如PYTHON,JAVA,C++,PHP,C#,RUBY等。
​
    MongoDB 將資料儲存為一個文件,資料結構由鍵值(key=>value)對組成。MongoDB 的文件類似於 JSON 物件。欄位值可以包含其他文件,陣列及文件陣列。

  

安裝

# 如果要在ubuntu16.04中安裝最新4.4版本mongodb,則需要完成以下命令步驟:
    # 匯入包管理系統使用的公鑰
    wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
    # 註冊mongodb源    // 16.04
    echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-          org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
    # 更新源
    sudo apt-get update
    # 安裝mongodb
    sudo apt-get install -y mongodb-org=4.4.2 mongodb-org-server=4.4.2 mongodb-org-             shell=4.4.2 mongodb-org-mongos=4.4.2 mongodb-org-tools=4.4.2
    # 建立資料儲存目錄
    sudo mkdir -p /data/db
    # 修改配置
    /etc/mongodb.conf

  

啟動

# 重新載入配置,並啟動mongodb
sudo systemctl daemon-reload
sudo systemctl start mongod
​
# 檢視執行狀態
sudo systemctl status mongod
# 如果mongodb狀態為stop,則執行 sudo systemctl enable mongod
​
# 停止mongodb
sudo systemctl stop mongod
​
# 重啟mongodb
sudo systemctl restart mongod
​
# 進入互動終端
mongo
# 退出互動終端
exit

  

效果

MongoDB shell version v4.4.2
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("2c920d56-ddbb-4649-9191-a3bd4506a2d2") }
MongoDB server version: 4.4.2
---
The server generated these startup warnings when booting: 
        # 警告:強烈建議使用XFS檔案系統,並使用WiredIger儲存引擎。
        # 解釋:因為當前ubuntu使用的是ext4檔案系統,mongodb官方建議使用XFS檔案系統功能更能發揮mongodb的效能,忽略不管
        2020-11-23T16:23:34.416+08:00: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem
        # 警告:當前mongodb沒有為資料庫啟用訪問控制。對資料和配置的讀寫訪問是不受限制的。
        # 解釋:後面會建立資料庫使用者採用密碼登陸的。暫時不用管
        2020-11-23T16:23:35.046+08:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
---
---
        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()
---

  

使用者管理

# 內建角色
資料庫使用者角色:read、readWrite; 
資料庫管理角色:dbAdmin、dbOwner、userAdmin;
叢集管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager; 
備份恢復角色:backup、restore; 
所有資料庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase 
超級使用者角色:root
# 有幾個角色間接或直接提供了系統超級使用者的訪問許可權(dbOwner 、userAdmin、userAdminAnyDatabase)
​
# 內建許可權
Read:允許使用者讀取指定資料庫
readWrite:允許使用者讀寫指定資料庫
dbAdmin:允許使用者在指定資料庫中執行管理函式,如索引建立、刪除,檢視統計或訪問system.profile
userAdmin:允許使用者向system.users集合寫入,可以找指定資料庫裡建立、刪除和管理使用者
clusterAdmin:只在admin資料庫中可用,賦予使用者所有分片和複製集相關函式的管理許可權。
readAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的讀許可權
readWriteAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的讀寫許可權
userAdminAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的userAdmin許可權
dbAdminAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的dbAdmin許可權。
root:只在admin資料庫中可用。超級賬號,超級許可權
​
# Admin資料庫(管理賬號)
    # 建立賬戶管理員
        use admin
        # 建立賬戶管理員
        db.createUser({
            user: "admin",
            pwd: "1",
            roles: [
                {role: "userAdminAnyDatabase",db:"admin"}
            ]
        })
    # 建立超級管理員
        use admin
        # 建立超級管理員賬號
        db.createUser({
            user: "root",
            pwd: "1",
            roles: [
                { role: "root", db: "admin" }
            ]
        })
        
    # 建立管理員使用者
        use mofang
        db.createUser({
            user: "bajie",
            pwd: "1",
            roles: [
                { role: "dbOwner", db: "mofang"}
            ]
        })
# 操作
show users                                     # 檢視當前庫下的使用者
db.system.users.find()                         # 檢視系統中所有的使用者
db.system.users.remove({user:"mofang"})        # 刪除使用者
db.changeUserPassword("mofang", "123456")      # 修改密碼
db.auth("root","123")                          # 登入
sudo mongod -f /etc/mongod.conf --fork --auth  # 開啟mongodb賬戶認證機制

 

基本操作

help                     # 檢視幫助文件
db.serverStatus()        # 當前伺服器操作
db.getMongo()            # 連線mongo的IP和埠
show logs                # 檢視現有的日誌庫
show log <logname>       # 檢視具體的日誌庫資料

  

術語對比

SQLMongodb
庫(database) 庫(database)
表(Talbe) 集合(Collection)
行/記錄(Row) 文件(Document)
列/欄位(Col) 欄位/域(Field)
主鍵(Primary Key) 物件ID(ObjectId)
索引(Index) 索引(Index)

資料型別

Type描述
ObjectID 用於儲存文件的ID,相當於主鍵
String 字串是最常用的資料型別,MongoDB中的字串必須是UTF-8編碼。
Integer 整數型別用於儲存數值。整數可以是32位,也可以是64位,這取決於你的伺服器。
Double 雙精度型別用於儲存浮點值,mongodb中沒有float浮點數這個說法
Boolean 布林型別用於儲存布林值(true/ false)
Arrays 將陣列、列表或多個值儲存到一個鍵
Timestamp 時間戳,用於記錄文件何時被修改或建立。
Object 用於嵌入文件,相當於子屬性是另一個json而已
Null 空值,相當於 python的None
Symbol 與字串用法相同,常用於某些使用特殊符號的語言
Date 用於以UNIX時間格式儲存當前日期或時間。
Binary data 二進位制資料
Code 用於將JavaScript程式碼儲存到文件中
Regular expression 正則表示式

庫操作

show dbs                # 顯示所有資料庫
use  <database>         # 切換資料庫,不存在則建立
db.getName()            # 檢視當前使用的資料庫
db.dropDatabase()       # 刪除當前資料庫,不存在不報錯
db.stats()              # 檢視當前資料庫狀態

  

集合操作

# 在mongodb中其實不建立集合,直接新增文件,mongodb也會自動生成集合的
db.test.insert({"_id":1,"name":"bajie"})        # 建立並新增文件
db.createCollection(name=<集合名稱>, options  = { 
    capped : <boolean>,
    # 建立固定集合,固定集合指限制固定資料大小的集合,當資料達到最大值會自動覆蓋最早的文件內容 
    size : <bytes_size>,      
    # 指定固定集合儲存的最大位元組數,單位:位元組數.
    max : <collection_size>   
    # 指定固定集合中包含文件的最大數量,單位:位元組數
}                                               # 配置集合
show collections/tables                         # 檢視當前庫所有集合
db.<集合名稱>.drop()                             # 刪除集合  
db.printCollectionStats()                       # 檢視當前集合的建立資訊

  

文件操作

db.集合名稱.insert({"_id":1,"name":"bajie"})     # 新增一個文件
db.集合.insertOne(<document>)                   # 如果文件存在_id主鍵為更新資料,否則就新增資料。
db.集合.insertMany(
   [{"_id":1,"name":"bajie"},{"_id":2,"name":"bajie"}]
)               # 一次性新增多個文件, 多次給同一個集合建議使用insertMany比insertOne效率更好

  

db.集合.remove(
   <query>,  # remove的查詢條件,一般寫法:{"屬性":{條件:值}},如果不填寫條件,刪除所有文件
   {
     justOne: <boolean>,      # 可選刪除,是否只刪除查詢到的第一個文件,預設為false,刪除所有
     writeConcern: <document> # 可選引數,丟擲異常的級別。
   }
)
​
db.mofang.remove({"_id":1,"name":"bajie"})

  

# 更新一條
db.集合.update(
   <query>,   # update的查詢條件,一般寫法:{"屬性":{條件:值}}
   <update>,  # update的更新資料,一般寫法 { $set:{"屬性":"值"} } 或者 { $inc:{"屬性":"值"} }
   {
     upsert: <boolean>, # 可選引數,如果文件不存在,是否插入objNew, true為插入,預設是false,不插入
     multi: <boolean>,  # 可選引數,是否把滿足條件的所有資料全部更新
     writeConcern: <document> # 可選引數,丟擲異常的級別。
   }
)
​
# 更新多條
db.集合.updateMany(
   <query>,   # update的查詢條件,一般寫法:{"屬性":{條件:值}}
   <update>,  # update的物件,一般寫法 { $set:{"屬性":"值"} } 或者 { $inc:{"屬性":"值"} }
   {
     upsert: <boolean>, # 可選引數,如果文件不存在,是否插入objNew, true為插入,預設是false,不插入
     multi: <boolean>,  # 可選引數,是否把滿足條件的所有資料全部更新
     writeConcern: <document> # 可選引數,丟擲異常的級別。
   }
)

  

update修改器
操作語法
$inc db.集合.update({<key1>:<val1>},{$inc:{<key2>:<val2>}}) 更新key1=val1的文件中key2的值為val2,類似python的遞增遞減
$set db.集合.update({<key1>:<val>}, {$set:{<key2>:<val2>}}) 更新key1=val1的文件中key2的值為val2,如果key2不存在則新增對應鍵值對
$unset db.集合.update({<key1>:<val>}, {$unset:{<key2>:<val2>}}) 移除key1=val1的文件中key2=val2這個鍵值對
$push db.集合.update({<key1>:<val>}, {$push:{<key2>:<val2>}}) 給key1=val1的文件中key2列表增加一個數組成員val2。 key2必須是陣列
$pull db.集合.update({<key1>:<val>}, {$pull:{<key2>:<val2>}}) 與push相反,給key1=val1的文件中key2列表刪除指定成員val2
$pop db.集合.update({<key1>:<val>}, {$pop:{<key2>:<val2>}}) 給key1=val1的文件中key2列表移除第一個或最後一個成員。 val2只能是1(最後面)或-1(最前面),與python相反

# 直接顯示查詢的所有
# 獲取一條
db.集合.findOne(
    <query>,     # 查詢條件
    {
        <key>: 0, # 隱藏指定欄位,例如:"_id":0,
        <key>: 1, # 顯示指定欄位,例如:"title":1,
        ....
    }
)
# 獲取多條
db.集合.find(
    <query>,      # 查詢條件
    {
        <key>: 0, # 隱藏指定欄位,例如:"_id":0,
        <key>: 1, # 顯示指定欄位,例如:"title":1,
        ....
    }
)
​
# 以易讀的方式來格式化顯示讀取到的資料
db.col.find().pretty() 

  

比較運算
操作格式範例SQL中的類似語句
等於 {<key>:<val>} {<key>:{$eq:<val>}} db.集合.find({"name":"xiaoming"}) where name = 'xiaoming'
小於 {<key>:{$lt:<val>}} db.集合.find({"age":{$lt:17}}) where age < 17
小於或等於 {<key>:{$lte:<val>}} db.集合.find({"age":{$lte:17}}) where age <= 17
大於 {<key>:{$gt:<val>}} db.集合.find({"age":{$gt:17}}) where age > 17
大於或等於 {<key>:{$gte:<val>}} db.集合.find({"age":{$gte:17}}) where age >= 17
不等於 {<key>:{$ne:<val>}} db.集合.find({"age":{$ne:17}}) where age != 17
包含 {<key>:{$in:<val>}} db.集合.find({"age":{$in:[1,2,3]}}) where age in (1,2,3)
終端執行效果
db.my_friend.find({"name":{$eq:"xiaohong"}}).pretty()
db.my_friend.find({"age":{$gt:15}}).pretty()

  

邏輯運算
操作格式語法
$and {<key>:<val>,<key>:<val>,...} db.集合.find({key1:value1, key2:value2})
$or {$or: [{<key>: <val>}, {<key>:<val>}]} db.集合.find({$or: [{key1: value1}, {key2:value2}]})
$and$or {<key>:<val>, $or: [{<key>: <val>}, {<key>:<val>}]} {$and:[{$or:[{<key>:<val>},..]},$or:[{<key>:<val>},..]}]} db.集合.find({key1:value1, $or: [{key1: value1}, {key2:value2}]})
$not {<key>:{$not:{<$運算子>:<val>}}} $not操作符不支援`$regex正則表示式操作

其他運算子
操作格式語法說明
$type {<key>:{$type: <datetype>}} db.集合.find({"name":{$type:'string'}}) 匹配指定鍵是指定資料型別的文件
$exists {<key>:{$exists:<bool>} db.集合.find({"title":{$exists:true}}) 匹配具有指定鍵的文件
$regex { <key>:/模式/<修正符>} {<key>:{$regex:/模式/<修正符>}} db.集合.find({"name":{$regex:/張$/}}) 按正則匹配
排序顯示
db.集合.find().sort({<key>:1})  # 升序,預設為升序
db.集合.find().sort({<key>:-1}) # 倒序, 

  

欄位投影
find()方法預設將返回文件的所有資料,但是可以通過設定`find()`的第二個引數projection,設定值查詢部分資料。
​
語法:
# 獲取一條
db.集合.findOne(
    <query>,     # 查詢條件
    {
        <key>: 0, # 隱藏指定欄位,例如:"_id":0,
        <key>: 1, # 顯示指定欄位,例如:"title":1,
        ....
    }
)
# 獲取多條
db.集合.find(
    <query>,      # 查詢條件
    {
        <key>: 0, # 隱藏指定欄位,例如:"_id":0,
        <key>: 1, # 顯示指定欄位,例如:"title":1,
        ....
    }
)

  

PyMongo

安裝

pip install pymongo

  

資料庫連線

import pymongo
# 無密碼連線
mongo = pymongo.MongoClient("mongodb://127.0.0.1:27017/")
​
# 密碼連線
import pymongo
from urllib import parse
username = parse.quote_plus('bajie')    # 對使用者名稱進行編碼
password = parse.quote_plus('1')        # 對密碼進行編碼
database = parse.quote_plus("mofang")   # 資料庫名稱
host     = "127.0.0.1"                  # ip
port     = "27017"                      # 埠號
​
mongo = pymongo.MongoClient(f"mongodb://{username}:{password}@{host}:{port}/{database}")
# 登入資料庫mofang連結物件
db = mongo["mofang"]                # 切換到mofang資料庫
table = db["t_user"]                # 建立表物件
print(mongo.database_names())       # 列印當前連結物件所擁有的庫列表

  

集合操作

mongo = pymongo.MongoClient(f"mongodb://{username}:{password}@{host}:{port}/{database}")
# 登入資料庫mofang連結物件
db = mongo["mofang"]                # 切換到mofang資料庫
t_user = db["t_user"]               # 建立表物件
db.collection_names()               # 列印集合列表
db["t_user"].drop()                 # 刪除表
db.drop_collection("t_user")        # 刪除表

  

文件操作

tb = db["t_book"]
document = { "name": "xiaoming", "mobile": "13012345678","age":16,"sex":True}
ret = tb.insert(document)                  # 增加一條記錄,返回id值
​
data_list = [
    { "name": "xiaobai", "mobile": "13322345678","age":16,"sex":False},
    { "name": "xiaohei", "mobile": "13322345678","age":20,"sex":True},
    { "name": "xiaohong", "mobile": "13322345678","age":13,"sex":False},
    { "name": "xiaolan", "mobile": "13322345678","age":17,"sex":True},
    { "name": "xiaolv", "mobile": "13322345678","age":17,"sex":True},
    { "name": "xiaolong", "mobile": "13322345678","age":16,"sex":False},
    { "name": "xiaofei", "mobile": "13322345678","age":18,"sex":True},
]
ret = tb.insert_many(data_list)            # 增加多條記錄,返回結果物件

  

query = {"age":1}
ret = tb.delete_one(query)    # 刪除一個文件,返回結果物件
​
query = { "mobile": {"$regex": "^130"} }
ret = my_collection.delete_many(query)
​
query = { "mobile": {"$regex": "^130"} }
ret = tb.delete_many(query)   # 刪除多個文件,返回結果物件
ret.deleted_count             # 刪除文件數量
​
query = {"name":"xiaobai"}
document = tb.find_one_and_delete(query)   # 查詢一條資料出來並刪除,返回一條資料,如果沒有,則返回None
​

  

# 按條件修改欄位(沒有則新增)
query = {"_id":1}
upsert = {"$set":{"mobile":"999999"}}
tb.update_one(query,upsert)
​
"""按條件累加/累減指定數值一個文件的指定資料"""
query = { "name": "xiaofei" }
upsert = { "$inc": { "age": -1 } } # 累減
ret = tb.update_one(query, upsert)
​
"""更新多條資料"""
# 把所有以"133"開頭的手機碼號的文件,全部改成15012345678
query = { "mobile": {"$regex":"^150"} }
upsert = { "$set": { "mobile": "18512345678" } }
ret = my_collection.update_many(query, upsert)

  

document = tb.find_one()                 # 一條文件,查詢不到則返回None
document_list = tb.find()                # 所有文件列表, 查詢不到,返回空列表
for document in tb.find({},{"name":1})   # 只顯示name欄位
​
# 條件查詢
query = {"age":18}
document_list = tb.find(query)
for document in document_list:
    print(document)
    
# 比較運算子的使用
query = {"age":{"$gt":18}}
document_list = tb.find(query)
for document in document_list:
    print(document)
​
# 排序(單欄位)
query = {"age":{"$gt":5}}
document_list = tb.find(query).sort("age",-1)
for document in document_list:
    print(document)
    
# 排序(多欄位)
query = {"age":{"$gt":5}}
document_list = tb.find(query).sort([("age",-1),("name",1)])
for document in document_list:
    print(document)
    
# 限制查詢結果數量
query = {"age":{"$gt":5}}
document_list = tb.find(query).sort([("age",-1),("name",1)]).limit(3)
for document in document_list:
    print(document)