基礎命令
- 查看當前的數據庫:
db
- 查看所有的數據庫:
show dbs /show databases
- 切換數據庫:
use db_name
- 刪除當前的數據庫:
db.dropDatabase()
關於集合的基礎命令
- 不手動創建集合:向不存在的集合中第一次加入數據時,集合會被創建出來
- 手動創建
db.createCollection(name,options) db.createCollection("stu") db.createCollection("sub",{capped:true,size:10}) 參數capped:默認值爲false表示不設置上限,值爲true表示設置上限 參數size:當capped值爲true時,需要指定此參數,表示上限大小,當 文件達到上限時,會將之前的數據覆蓋,單位爲字節
- 查看集合:
show collections
- 刪除集合:
db.集合名字.drop()
數據類型
- Object ID:文檔ID
- String:字符串,最常用,必須是有效的UTF-8
- Boolean:存儲一個布爾值,true或者false
- Integer:整數可以是32位或者64位,這取決於服務器
- Double:存儲浮點型
- Arrays:數組或者列表,多個值存儲到一個鍵
- Object:用於嵌入式文檔,及一個值爲一個文檔
- Null:存儲Null值
- Timestamp:時間戳,表示從1970-1-1到現在的總秒數
- Date:存儲當前日期或者UNIX時間格式
插入
- db.集合名稱.insert(document)
- db.stu.insert({name:"test",age:10})
- db.stu.insert({_id:"202007131742",name:"de",age:1)
- 插入文檔時,如果不指定_id參數,MongoDB會爲文檔分配一個唯一的ObjectId
保存
- db.集合名稱.save(document)
- 如果文檔的_id已經存在則修改,如果文檔的_id不存在則添加
更新
db.集合名稱.update(<query>,<update>,{<multi:<boolean>>})
db.stu.update({name:"hr"},{name:"mmp"}) 更新一條(替換,其他屬性會缺失) db.stu.update({name:"hr"},{$set:{name:"mmp"}}) 更新一條 db.stu.update({},{$set:{age:10}},{multi:true}) 更新全部
- query:查詢條件
- update:更新操作符
- multi:可選,默認時false,表示只更新找到的第一條記錄,true表示把滿足條件的文檔全部更新
刪除
db.集合名稱.remove(<query>,{justOne:<boolean>})
- query:可選,刪除的文檔的條件
- justOne:可選,默認時false,表示刪除多條,設置爲true或1,則只刪除一條
查詢
- 方法find():查詢-->db.集合名稱.find({查詢條件})
- 方法 findOne():查詢,只返回第一條-->db.集合名稱.findOne({查詢條件})
- 方法 pretty():將結果格式化-->db.集合名稱.find({查詢條件}).pretty()
比較運算符
- 等於:默認是等於判斷,沒有運算符
- 小於:$lt(less than)
- 小於等於:$lte(less than equal)
- 大於:$gt(greater than)
- 大於等於:$gte(greater than equal)
- 不等於:$ne(no equal)
- db.stu.find({age:{$lte:10}})
範圍運算符
- 在某個範圍:$in
- 不在某個範圍:$nin
- db.stu.find({age:{$in:[18,28,38]}})
邏輯運算符
- and:在json中寫多個條件即可
- or:使用$or,值爲數組,數組中每個元素爲json
- 年齡大於等於18,且性別爲true:db.stu.find({age:{$gte:18},gender:true})
- 年齡大於18,或性別爲false:db.stu.find({$or:[age:{$gte:18},gender:false]})
- 年齡大於18,或性別爲false,且名字時"test":db.stu.find({$or:[age:{$gte:18},gender:false],name:"test"})
正則
- 使用//或者$regex編寫正則表達式
- 以abc開頭的:db.stu.find({sku:/^abc/})
- 以123結尾的:db.stu.find({sku:{$regex:"123$"}})
limit和skip
- limit():用於讀取指定數量的文檔-->db.stu.find().limit(4)
- skip():用於跳過指定數量的文檔-->db.stu.find().skip(5)
- 同時使用-->db.stu.find().limit(4).skip(5)或db.stu.find().skip(5).limit(4)(翻頁)
自定義查詢*
- 使用$whert後面寫一個函數,範圍滿足條件的數據
- db.stu.find({$where:function(){return this.age>30;}})
- db.stu.find().sort({age:1}) 按年齡排序:1升序,-1降序
- db.stu.find().count()或db.stu.count() 統計數量
- db.stu.distinct("name",{age:{$gt:18}}) 消除重複(去除大於18、名字重複的數據)
投影
- 在查詢到的返回結果中,只選擇必要的字段
- db.stu.find({},{filed:1,...)
- 參數爲字段與值,值爲1表示顯示,值爲0表示不顯示
- 特殊:對於_id列默認時顯示的,如果不顯示需要明確設置爲0
- 其他字段,如果不顯示不寫,不能寫0
數據的備份和恢復
-
備份數據:
mongodump -h dbhost -d dbname -o dbdirectory
- h:服務器地址,也可以指定端口號
- d:需要備份的數據庫名稱
- o:備份的數據存放位置,此目錄中存放着備份出來的數據
mongodump -h 192.168.1.65:27017 -d test1 -o ~/Desktop/test1bak
-
恢復數據:
mongorestore -h dbhost -d dbname --dir dbdirectory
- h:服務器地址
- d:需要恢復的數據庫實例
- dir:備份的數據所在位置
mongorestore -h 192.168.1.65:27017 -d test2 --dir ~/Desktop/test1bak/test1
聚合aggregate
- 聚合時基於數據處理的聚合管道,每個文檔通過一個由多個階段組成的管道,可以對每個階 段的管道進行分組、過濾等功能,然後經過一系列的處理,輸出相應的結果
- db.集合名稱.aggregate({管道:{表達式}})
db.stu.aggregate([{$match:{status:"A"}}, {$group:{_id:"$cust_id",total:{$sum:"$amount"}}}])
常用管道
- 在mongodb中,文檔處理完畢後,通過管道進行下一次處理
- $group:將集合中的文檔分組,可用於統計結果
$group
對應的字典裏有幾個鍵,結果就有幾個鍵- 分組依據要放到
_id
後面 - 去不同的字段的值需要使用$,如:"$age","$name"
- 取字典嵌套中的值的時候
$_id.age
- 能夠同時按照多個鍵進行分組
{$group:{_id:{age:"$age",name:"$name"}}}
- 結果是:
{_id:{age:18,name:"xiaom"}}
- 結果是:
- $match:過濾數據,只輸出符合條件的文檔
- $project:修改輸入文檔結構,如重命名、增加、刪除字段、創建計算結果
- $sort:將輸入的文檔排序後輸出
- $limit:限制聚合管道返回的文檔數
- $skip:跳過指定數量的文檔,並返回餘下的文檔
- $unwind:將數組類型的字段進行拆分
表達式
- 處理輸入文檔並輸出
- 語法:表達式:"$列名"
- $sum:計算總和,$sum:1表示以一倍計數
- $avg:計算平均值
- $min:獲取最小值
- $max:獲取最大值
- $push:在結果文檔中插入值到一個數組中
- $first:根據資源文檔的排序獲取第一個文檔數據
- $last:根據資源文檔的排序獲取最後一個文檔數據