- [*] 本文出處:http://b1u3buf4.xyz/
- [*] 本文作者:B1u3Buf4
- [*] 本文授權:禁止轉載
從自己的另一處部落格移動過來。長期維護,不定期新增新內容。
前述和安裝
mongoDB按照分類應當是非關係型資料庫,這種資料庫沒有傳統sql那樣的表的概念,自然也不支援多表查詢。
linux 安裝
官方的linux安裝文件在這裡
安裝方法無外乎是兩種:
一種是下載原始檔,然後手動安裝;另一種是通過包管理器進行安裝。
介紹通過包管理在ubuntu上安裝:
向包管理系統匯入公鑰
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5
建立檔案列表(這裡是16.04,不同版本此處有差別)
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list
更新包資料
sudo apt-get update
安裝最新的穩定版
sudo apt-get install -y mongodb-org
通過啟動服務命令,然後就可以執行mongodb了。
docker容器部署
拉取映象:
docker pull mongo:latest
建立、執行一個容器:
docker run -p 27017:27017 -d mongo:latest #其他引數自定
坑人的地方
首先是docker自身的不穩定性,會導致資料丟失。典型的就是有時候容器壞了拉不起來,然後要重新配置。所有的資料自然而然是沒有了。
其次是效率。相對於直接使用,效能有所損耗,在大量寫入的時候耗時多。
不推薦盲目地在生產中使用docker下的mongoDB。做測試是可以的。
Windows安裝
在官方網站上下載mongoDB,最新的版本只支援64位。
開啟安裝包,選擇“Custom”自定義安裝,安裝路徑可以修改到非系統盤。然後不斷“下一步”,安裝至結束。
建立資料庫檔案的存放位置
因為啟動mongodb服務之前需要必須建立資料庫檔案的存放資料夾,否則命令不會自動建立,而且不能啟動成功。資料存放的位置也是比較隨意的。命令列中使用如下命令啟動mongodb服務:mongod --dbpath 資料存放位置的絕對地址
,命令列中會看到一些初始化的內容。如果不成功,可以檢視一下埠是否被佔用。
命令列下執行MongoDB伺服器或者配置MongoDB服務,兩者任選一個方式啟動就可以了。
新建一個mongo.config並輸入(dbpath是資料儲存的地址,logpath是記錄日誌的地址。):
dbpath=D:data
logpath=D:MongoDBmongo.log
在管理員CMD下輸入:mongod --config mongo.config --install --serviceName "MongoDB"
。即根據剛建立的mongo.config配置檔案安裝服務,名稱為MongoDB。
之後就可以通過命令或者在“服務”中控制MongoDB了。
啟動MongoDB服務
net start MongoDB
關閉MongoDB服務
net stop MongoDB
GUI管理器
之前一直使用一個叫robo3t的GUI管理軟體,功能中規中矩。雖然版本不是很新,測試是可以相容最新的mongoDB的。
推薦使用官方自帶的MongoDB Compass
。簡潔,強大。在安裝mongoDB之後會提示安裝。
如果沒有的話,可到在MongoDB的官網上下載,下載需要填寫一點資訊,可以瞎填,提交就會開始下載。國家最好選在中國或者附近,上次選了大洋彼岸的國家,下載地址根本訪問不到。
MongoDB和關係型資料庫不同之處
操作 關係型 MongoDB
database database 資料庫/資料庫
table collection 資料表/集合
row document 資料記錄行/文件
column field 資料欄位/域
index index 索引/索引
table joins 表連線/MongoDB不支援
primary key primary key 主鍵/MongoDB自動將_id欄位設定為主鍵
mongoDB語法
附帶了SQL語句,以便理解。
查詢所有表中資訊
db.users.find()
select * from users
條件查詢
db.users.find({"username" : "joe", "age" : 27})
select * from users where "username" = "joe" and age = 27
依據條件查詢所有資訊
db.users.find({}, {"username" : 1, "email" : 1})
select username, email from users
#明確注意禁止_id值的返回
db.users.find({}, {"username" : 1, "_id" : 0})
數值範圍條件查詢
#$lt(小於) $lte(小於等於) $gt(大於) $gte(大於等於)
db.users.find({"age" : {"$gte" : 18, "$lte" : 40}})
select * from users where age >=18 and age <= 40
不等條件查詢
db.users.find({"username" : {"$ne" : "joe"}})
select * from users where username <> "joe"
表範圍查詢
db.users.find({"ticket_no" : {"$in" : [725, 542, 390]}})
select * from users where ticket_no in (725, 542, 390)
db.users.find({"ticket_no" : {"$nin" : [725, 542, 390]}})
select * from users where ticket_no not in (725, 542, 390)
同集合多條件查詢
db.users.find({"$or" : [{"ticket_no" : 725}, {"winner" : true}]})
select * form users where ticket_no = 725 or winner = true
pymongo模組用法
安裝pymongo
pip install pymongo
匯入模組
import pymongo
僅做客戶端操作的時
from pymongo import MongoClient
建立連線
conn = MongoClient(`192.168.0.111`, 27017)
或者
conn = MongoClient(`192.168.0.111:27017`)
連線至資料庫
db = conn.mydb
或者
db = conn[`mydb`]
mydb為所要連線的資料庫,如果不存在,則建立資料庫。
連線選擇資料集合
myset = db.test
或者
myset = conn.mydb.test
test為所要使用的集合,沒有則自動建立。
檢視全部集合
db.collection_names()
檢視指定集合中某條記錄
db.Account.find_one({"key":"value"})
檢視指定集合的欄位
db.Account.find_one({},{"k1":v1,"k2":"v2"})
檢視指定集合中多條記錄
for item in db.Account.find():
item
for item in db.Account.find({"Name":"li"}):
item["Name"]
檢視指定集合記錄統計
db.Account.find().count()
db.Account.find({"key":"value"}).count()
集合查詢結果排序
db.Account.find().sort("Name") #預設為升序
db.Account.find().sort("Name",pymongo.ASCENDING) #升序
db.Account.find().sort("Name",pymongo.DESCENDING) #降序
集合查詢結果多列排序
db.Account.find().sort([("Name",pymongo.ASCENDING),("add",pymongo.DESCENDING)])
還有一個find_one()的方法,返回符合條件的一條記錄,而find()則是返回返回所有可能的內容。
通常在需要隨機抽出一條內容的情況下使用find_one()更實用。
更高階的擴充套件
下面方法在執行完相應第一個的操作之後,會附加進行另一個操作。
查詢之後進行刪除
find_one_and_delete()
查詢之後進行更新
find_one_and_update()
查詢之後進行替換
find_one_and_replace()
新增記錄
db.Account.insert({"ID":21,"Name":"Ling"})
修改記錄
db.Account.update({"User":"li"},{"$set":{"add":"BJ","pw":"123"}})
刪除記錄
db.Account.remove() #全部刪除
db.Test.remove({"key":"value"}) #指定刪除