
3971cc7a37f14a60c7a53a64e52e6b05f46fb1fb (1).jpg

MongoDB 基礎(chǔ)教程.jpg
創(chuàng)建數(shù)據(jù)庫
# 格式
> use 數(shù)據(jù)庫名稱
# 例如
> use school
創(chuàng)建集合
- 創(chuàng)建一個(gè)普通的集合
# 格式
> db.createCollection(集合名稱)
# 例如
> db.createCollection("student")
- 創(chuàng)建一個(gè)帶參數(shù)的集合
# 格式
> db.createCollection(集合名稱,可選參數(shù))
# 例如
> db.createCollection("subject", {autoIndexId:true} )
| 可選參數(shù) | 類型 | 說明 |
|---|---|---|
| autoIndexId | bool | 默認(rèn)為 false,如果設(shè)置為 true,則會在 _id 字段上自動(dòng)創(chuàng)建索引 |
| capped | bool | 如果為 true 則創(chuàng)建一個(gè)固定大小的集合,當(dāng)其條目達(dá)到最大時(shí)可以自動(dòng)覆蓋以前的條目。在設(shè)置其為 true 時(shí)也要指定參數(shù)大小 |
| size | int | 如果 capped 為 true 則需要指定,指定參數(shù)的最大值,單位為 byte |
| max | int | 指定最大的文檔數(shù) |
插入文檔
- 插入 student 文檔
> db.student.insert([
{name:"小蘭",gender:"女",age:18 },
{name:"新一",gender:"男",age:18 }
])
- 插入 subject 文檔
> subject_list = [{"name":"算數(shù)"},{"name":"圖畫"},{"name":"體育"}]
> db.subject.insert(subject_list)
更新文檔
- 根據(jù) _id 更新
# 格式
> db.集合名稱.save({_id:ObjectId(文檔的_id),key:value})
# 例如
> db.student.save({_id:ObjectId("5f3633a5a36e80089d0c495d"),"name":"新一","gender":"男"})
根據(jù) _id 更新會替換之前的文檔,而非只更新某個(gè)字段。
- 根據(jù)篩選項(xiàng)更新
# 格式
> db.集合名稱.update( {key1:value1},{$set:{key2:value2}} )
# 例如
> db.student.update( {"age":18},{$set:{"age":19}},{multi:true} )
update 默認(rèn)只對一個(gè)文檔更新,更新所有文檔需要添加 multi:true。
查詢文檔
- 查詢所有
# 格式
> db.集合名稱.find()
# 例如
> db.student.find()
- AND 查詢
# 格式
> db.集合名稱.find({ key: value })
# 例如
> db.student.find({ "name": "小蘭" })
- OR 查詢
# 格式
> db.集合名稱.find({ $or: [{key1: value1},{key2: value2}] })
# 例如
> db.student.find({ $or: [{"name": "柯南"},{"name": "新一"}] })
- 條件查詢
# 格式
> db.集合名稱.find({ key: {條件操作符:value} })
# 例如
> db.student.find({ "age": {$gte:18} })
| 條件操作符 | 含義 |
|---|---|
| $lt | 小于 |
| $gt | 大于 |
| $lte | 小于等于 |
| $gte | 大于等于 |
| $ne | 不等于 |
- 模糊查詢
# 匹配前綴格式
> db.集合名稱.find({ key:"/^value/" })
# 例如
> db.student.find({ "age":"/^1/" })
# 匹配后綴格式
> db.集合名稱.find({ key:"/value$/" })
# 例如
> db.student.find({ "name":"/$蘭/" })
- 數(shù)據(jù)類型查詢
# 格式
> db.集合名稱.find({ key:{$type:value} })
# 例如
> db.student.find({ "name":{$type:"string"} })
# 等同于
> db.student.find({ "name":{$type:2} })
| 類型值 | 數(shù)據(jù)類型 | 類型別名 |
|---|---|---|
| 1 | 雙精度型(Double) | double |
| 2 | 字符串(String) | string |
| 3 | 對象(Object) | object |
| 4 | 數(shù)組(Array) | array |
| 5 | 二進(jìn)制數(shù)據(jù)(Binary data) | binData |
| 7 | 對象 ID(Object id) | objectId |
| 8 | 布爾類型(Boolean) | bool |
| 9 | 日期(Date) | date |
| 10 | 空(Null) | null |
| 11 | 正則表達(dá)式(Regular Expression) | regex |
| 13 | JS 代碼(Javascript) | javascript |
| 14 | 符號(Symbol) | symbol |
| 15 | 有作用域的 JS 代碼(JavaScript with scope) | javascriptWithScope |
| 16 | 32 位整型數(shù)(32-bit integer) | int |
| 17 | 時(shí)間戳(Timestamp) | timestamp |
| 18 | 64 位整型數(shù)(64-bit integer) | long |
| -1 | 最小值(Min key) | minKey |
| 127 | 最大值(Max key) | maxKey |
- 限制查詢
# 格式
> db.集合名稱.find().limit(value)
# 例如
> db.student.find().limit(1)
- 跳過查詢
# 格式
> db.集合名稱.find().skip(value)
# 例如
> db.student.find().skip(1)
- 排序查詢
# 格式
> db.集合名稱.find().sort({key:value})
# 例如
> db.student.find().sort({"name":1}) # 1表示升序
> db.student.find().sort({"age":-1}) # -1表示降序
- 聚合查詢
# 格式
> db.集合名稱.aggregate(可選參數(shù))
# 例如
> db.student.aggregate([{
$group:{_id:"$age", count:{$sum:1}}
}])
| 可選參數(shù) | 說明 | |
|---|---|---|
| $match | 查詢,跟 find 一樣 | |
| $limit | 限制顯示結(jié)果數(shù)量 | |
| $skip | 忽略結(jié)果數(shù)量 | |
| $sort | 排序 | |
| $group | 按照給定表達(dá)式組合結(jié)果 |
| 聚合表達(dá)式 | 說明 |
|---|---|
| $sum | 計(jì)算總和 |
| $avg | 計(jì)算平均值 |
|
|
計(jì)算最小值和最大值 |
| $push | 在結(jié)果文檔中插入值到一個(gè)數(shù)組 |
| $addToSet | 在結(jié)果文檔中插入值到一個(gè)數(shù)組,但不創(chuàng)建副本 |
| $first | 根據(jù)資源文檔的排序獲取第一個(gè)文檔數(shù)據(jù) |
| $last | 根據(jù)資源文檔的排序獲取最后一個(gè)文檔數(shù)據(jù) |
文檔的關(guān)系
- 嵌入式關(guān)系
{
"name": "小蘭",
"age": 18,
"gender": "女",
"subject":
[
{
"name": "圖畫 "
}
]
}
把 subject 文檔嵌入到 student 文檔中,嵌入式關(guān)系比較適合一對一的情況。
- 引用式關(guān)系
{
"name": "新一",
"age": 18,
"gender": "男",
"subject_ids": [
ObjectId("5f36426fa36e80089d0c4960"),
ObjectId("5f36426fa36e80089d0c4962")
]
}
通過引用 subject 文檔的 _id 來與 student 文檔建立關(guān)系,引用式關(guān)系比較適合一對多或者多對多的情況。
創(chuàng)建索引
- 創(chuàng)建一個(gè)普通索引
# 格式
> db.集合名稱.ensureIndex({key:value})
# 例如
> db.student.ensureIndex({"name":1}) # 1表示升序
> db.student.ensureIndex({"age":-1}) # -1表示降序
- 創(chuàng)建一個(gè)聯(lián)合索引
# 格式
> db.集合名稱.ensureIndex({key1:value1,key2:value2})
# 例如
> db.student.ensureIndex({"name":1,"age":1})
- 創(chuàng)建一個(gè)帶參數(shù)的索引
# 格式
> db.集合名稱.ensureIndex({key:value},可選參數(shù))
# 例如
> db.student.ensureIndex({"name":1},{unique:true})
| 可選參數(shù) | 類型 | 說明 |
|---|---|---|
| background | Boolean | 建立索引要不要阻塞其他數(shù)據(jù)庫操作,默認(rèn)為 false |
| unique | Boolean | 建立的索引是否唯一,默認(rèn) false |
| name | string | 索引的名稱,若未指定,系統(tǒng)自動(dòng)生成 |
| dropDups | Boolean | 建立唯一索引時(shí),是否刪除重復(fù)記錄,默認(rèn) flase |
| sparse | Boolean | 對文檔不存在的字段數(shù)據(jù)不啟用索引,默認(rèn) false |
| expireAfterSeconds | integer | 設(shè)置集合的生存時(shí)間,單位為秒 |
| v | index version | 索引的版本號 |
| weights | document | 索引權(quán)重值,范圍為 1 到 99999 |
| default-language | string | 默認(rèn)為英語 |
| language_override | string | 默認(rèn)值為 language |
驗(yàn)證索引
- 驗(yàn)證覆蓋索引
# 格式
> db.集合名稱.find({key:value}).explain()
# 例如
> db.student.find({"name":"小蘭"}).explain()
- 驗(yàn)證指定索引
# 格式
> db.集合名稱.find({key:value}).hint({key:value}).explain()
# 例如
> db.student.find({"name":"小蘭"}).hint({name:1}).explain()