# mongoDB
以下為下載mongoDB的網址:
https://www.mongodb.com/try/download/community


## 安裝指令
echo logpath=D:\mongodb\log\mongo.log>D:\mongodb\mongod.cfg
echo dbpath=D:\mongodb\data\db >> D:\mongodb\mongod.cfg
D:\mongodb\bin\mongod.exe --config D:\mongodb\mongod.cfg --install
net start MongoDB
## 下載S3
以下為下載Robo3T的網址:
https://robomongo.org/

## 第二天練習 mongoDB
**滑鼠按右鍵 點選Open IntelliShell**


## 程式碼練習一
//show dbs 是用於列出當前 MongoDB 伺服器上的所有資料庫。
show dbs
//use mongo_class 用於切換到名為 mongo_class 的資料庫。
use mongo_class
//db.student.insert() 是一個插入文檔的 MongoDB 命令,需要在 insert() 函數中提供一個包含要插入的文檔的對象。
db.student.insert([{
"profile":{"name":"林小宏","id":"108418005"},
"course":{
"110-1":[
{"course_id":"179729","course_name":"專題討論(A)","credits":1},
{"course_id":"187174","course_name":"數位影像處理","credits":3},
{"course_id":"179746","course_name":"軟硬體共同設計","credits":3},
{"course_id":"179787","course_name":"VLSI系統架構設計","credits":1},
{"course_id":"187670","course_name":"高等計算機視覺","credits":3}
]
,"110-2":[
{"course_id":"182495","course_name":"專題討論(A)","credits":1},
{"course_id":"182515","course_name":"資料庫系統","credits":3},
{"course_id":"190446","course_name":"數位電視設計","credits":3},
{"course_id":"190517","course_name":"最佳化概論","credits":3}
]
}
},
{
"profile":{"name":"劉小賓","id":"108418006"},
"course":{
"110-1":[
{"course_id":"179729","course_name":"專題討論(A)","credits":1},
{"course_id":"187174","course_name":"數位影像處理","credits":3},
{"course_id":"187182","course_name":"互動式娛樂服務之音訊處理技術","credits":3},
{"course_id":"187656","course_name":"職場達人-自傳履歷與面試實務","credits":1},
{"course_id":"187670","course_name":"高等計算機視覺","credits":3}
],
"110-2":[
{"course_id":"182495","course_name":"專題討論(A)","credits":1},
{"course_id":"182515","course_name":"資料庫系統","credits":3},
{"course_id":"190446","course_name":"數位電視設計","credits":3},
{"course_id":"190517","course_name":"最佳化概論","credits":3}
]
}
}]
)
//show collections 是用於列出當前資料庫中的所有集合(collection)。
show collections
//db.student.count():返回 student 集合中文檔的數量。
db.student.count()
//返回當前所選擇的數據庫名稱。
db
//db.student.drop() //將永久刪除整個集合及其所有文檔。
//db.dropDatabase() //將永久刪除當前數據庫及其所有集合和文檔。
//查詢並返回 student 集合中的所有文檔。
db.student.find({})
//將符合條件 { "profile.id": "108418005" } 的文檔進行更新,將其 profile 字段的值更新為 { name: "林林林", id: "123456789" }。
db.student.update({"profile.id":"108418005"},{$set:{profile:{name:"林林林",id:"123456789"}}})
//刪除符合條件 { "profile.id": "108418006" } 的文檔。
db.student.remove({"profile.id":"108418006"})
單獨執行快捷鍵F6
整個程式一起執行F5(如果已經inser一個集合了會在原本的集合下新增一個集合)
**滑鼠按右鍵 點選Refresh Selected Item**

## 執行結果




## 程式碼練習二
show dbs
use mongo_class
db.test_data.insert([{'name': 'Anna',
'ages': 25,
'class': 'A',
'height': 150,
'weight': 44,
'score': 100,
'_id': '001'},
{'name': 'Chad',
'ages': 21,
'class': 'A',
'height': 170,
'weight': 75,
'score': 85,
'_id': '002'},
{'name': 'Ethan',
'ages': 42,
'class': 'A',
'height': 165,
'weight': 65,
'score': 90,
'_id': '003'},
{'name': 'Amy',
'ages': 33,
'class': 'B',
'height': 144,
'weight': 50,
'score': 75,
'_id': '004'},
{'name': 'Dory',
'ages': 12,
'class': 'C',
'height': 160,
'weight': 48,
'score': 88,
'_id': '005'},
{'name': 'Allen',
'ages': 45,
'class': 'B',
'height': 180,
'weight': 80,
'score': 93,
'_id': '006'},
{'name': 'Irving',
'ages': 25,
'class': 'C',
'height': 178,
'weight': 58,
'score': 60,
'_id': '007'}])
db.getCollection('test_data').find({class:{$eq:'A'}}) // 查詢class等於'A'的文檔,$eq 來確定字段是否等於特定值
db.getCollection('test_data').find({class:'A'}) // 查詢class等於'A'的文檔
//查詢體重小於60的文檔:
db.getCollection('test_data').find({weight:{$lt:60}})
//查詢名字不是'Chad'和'Ethan'的文檔:
db.getCollection('test_data').find({name:{$nin:['Chad','Ethan']}})
//查詢分數大於等於80且體重小於80的文檔:
db.getCollection('test_data').find({$and:[{score:{$gte:80}},{weight:{$lt:80}}]})
//查詢班級不是'B'且體重小於50的文檔:
db.getCollection('test_data').find({$nor:[{class:'B'},{weight:{$lt:50}}]})
// 查詢存在class字段的文檔
db.getCollection('test_data').find({class:{$exists:true}})
// 查詢存在class字段且class屬於['B', 'C']的文檔
db.getCollection('test_data').find({$and:[{class:{$exists:true}},{class:{$in:['B','C']}}]})
// 查詢class為'A'或'C'且score在60到90之間的文檔
db.getCollection('test_data').find({$and:[{class:{$in:['A','C']}},{score:{$gte: 60, $lte: 90}}]})
// 查詢所有文檔
db.getCollection('test_data').find()
//db.getCollection('test_data').find()
//db.getCollection('test_data').find()
//db.getCollection('test_data').find()
## 補充



## 程式碼練習三
show dbs
use mongo_class
db.library.insert([{
_id:"4-1_1",
book:"實用英文會話",
price:299.0, authors: ["Jason", "hhhhh", "Bob"],
borrower:{
name:"王小明",
timestamp:ISODate("2015-07-23T12:00:00Z")
}
},
{
_id:"4-1_2",
book:"七天學會大數據資料庫處理-NoSQL:MongoDB入門與活用",
price:360.0, authors: ["黃小嘉"],
borrower:{name:"王小明", timestamp:ISODate("2015-07-24T12:30:00Z")}
},
{
_id:"4-1_3",
book:"日本環球影城全攻略",
price:280, authors: ["Jason", "Mary", "Bob"]
}])
// 查詢價格小於等於 300 的library
db.getCollection('library').find({price:{$lte: 300}})
// 查詢滿足以下條件之一的圖書:
// 1. 作者中包含 'Bob' 和 'hhhhh'
// 2. 存在借閱者信息
db.getCollection('library').find({$or:[{ authors: { $all: ['Bob', 'hhhhh'] } },{ borrower: { $exists: true } }]})
// 將書名為 '實用英文會話' 的圖書更新為 '英文大會話'
db.library.update( { "book": "實用英文會話" },{ $set: { "book": "英文大會話" } })
// 將 ID 為 '4-1_2' 的圖書的作者更新為 ['黃小嘉', 'kim', 'hihi']
db.getCollection('library').update({"_id":"4-1_2"},{$set:{"authors":["黃小嘉","kim","hihi"]}})
// 保存(更新)ID 為 '4-1_2' 的圖書記錄,如果不存在則插入
db.getCollection('library').save({"_id":"4-1_2","authors":["黃小嘉","kim","hihi"]})
// 查詢書名中包含 'noSQL'(不區分大小寫)的圖書
db.library.find({ book:{$regex: /noSQL/, $options:"i"} })
//db.library.drop()
## 程式碼練習四
show dbs
use mongo_class
db.user_likes.insert([{"id":"1","name":"mark","age":25,"fans":100,"likes" : 1000},
{"id":"2","name":"steven","age":35,"fans":220,"likes" : 50},
{"id":"3","name":"stanly","age":30,"fans":120,"likes" : 33},
{"id":"4","name":"max","age":60,"fans":500,"likes" : 1000},
{"id":"5","name":"jack","age":30,"fans":130,"likes" : 1300},
{"id":"6","name":"crisis","age":30,"fans":130,"likes" : 100},
{"id":"7","name":"landry","age":25,"fans":130,"likes" :
100}])
// 查詢名字為 "mark" 的使用者,只返回 id 字段,排除 _id 字段
db.user_likes.find({ "name": "mark" }, { "id": 1,"_id":0 })
// 查詢滿足以下條件之一的使用者:
// 1. 年齡介於 30 到 60 歲之間
// 2. 粉絲數量大於等於 200
db.getCollection('user_likes').find({$and:[{ age:{ $gte: 30, $lt: 60 } }, { fans: { $gte: 200 }}]})
// 查詢滿足以下條件之一的使用者:
// 1. 粉絲數量小於等於 100
// 2. 喜歡數量小於 100
db.getCollection('user_likes').find({$or:[{fans: {$lte:100 }},{ like: { $lt: 100}}]})
// 查詢年齡為 25 或 60 歲的使用者
db.getCollection('user_likes').find({age:{ $in:[25,60]}})
// 查詢年齡既不是 25 也不是 60 歲的使用者,只返回 id 字段
db.getCollection('user_likes').find({age: { $nin:[25,60]}},{id:1})
// 查詢喜歡數量不大於 100 的使用者($not 運算符用於否定表達式)
db.getCollection('user_likes').find({ likes: {$not:{$gt: 100} } })
// 插入一個新的記錄,名為 "mark",年齡為 23
db.user_likes.insert({"name":"mark","age": 23})
// 插入一個新的記錄,名為 "steven",年齡為 23
db.user_likes.insert({"name":"steven","age":23})
// 插入一個新的記錄,名為 "jj",年齡為 23
db.user_likes.insert({"name":"jj","age":23})
// 將名為 "mark" 的用戶的年齡更新為 18
db.user_likes.update({"name":"mark"},{$set:{age:18}})
// 插入一個新的記錄,ID 為 1,喜歡數為 0
db.user_likes.insert({"id":1,"likes":0})
// 將 ID 為 1 的用戶的喜歡數增加 1
db.user_likes.update({"id":1},{"$inc":{"likes":1}})
//db.user_likes.drop()
## 程式碼練習五
show dbs
use mongo_class
db.chat.insert([{
_id:"4-2_1",
members: [ "Jason", "Bob" ],
messages: [
{ sender:"Jason", content:"Hello"},
{ sender:"Bob", content:"Hi"},
{ sender:"Jason", content:"午餐要吃什麼"},
{ sender:"Jason", content:"吃義大利麵!?"},
{ sender:"Bob", content:"走阿"}
]
},
{_id:"4-2_2", members:[ "Jason", "Mary" ], messages:[]},
{_id:"4-2_3", members:[ "Bob", "Mary" ], messages:[]}])
// 查詢含有特定內容 "吃義大利麵" 的聊天記錄
db.getCollection('chat').find({messages: {$elemMatch: {content: /吃義大利麵/}}})
// 查詢沒有任何訊息的聊天記錄
db.getCollection('chat').find({messages:{$size:0}})
// 使用正則表達式查詢含有特定內容 "吃義大利麵" 的聊天記錄
db.chat.find({ messages: { $elemMatch: { content: { $regex: /吃義大利麵/ } } } })

## 程式碼練習六
show dbs
use mongo_class
db.account.insert([{
"_id": "001",
"name": "小明",
"currency": [
{
"type": "TWD",
"cash": 1500,
"lastModified": ISODate("2021-01-01T12:00:00Z")
},
{
"type": "USD",
"cash": 9.99,
"lastModified": ISODate("2021-01-02T12:00:00Z")
}
]
},
{
"_id": "002",
"name": "小華",
"currency": [
{
"type": "USD",
"cash": 75.59,
"lastModified": ISODate("2021-01-03T12:00:00Z")
}
]
},
{
"_id": "003",
"name": "小花",
"currency": []
}])
// 更新帳戶 "小華" 中的 "USD" 貨幣類型為 "TWD",同時將現金數量乘以 30,並更新最後修改日期為當前日期
db.getCollection('account').update(
{ name: "小華", "currency.type": "USD" },
{
$mul: { "currency.$.cash": 30 },
$set: { "currency.$.type": "TWD" },
$currentDate: { "currency.$.lastModified": { $type: "date" } }
},
{ multi: true, upsert: false }
)
//db.account.drop()
## 程式碼練習七
show dbs
use mongo_class
db.school.insert([{ _id: "001", studentNumber: "102418099", studentName: "小明", score: 50},
{ _id: "002", studentId: "102418098", studentName: "小華", score: 80},
{ _id: "003", studentId: "102418097", studentName: "小花", score: 120}])
// 將 "studentNumber" 字段更名為 "studentid"
db.getCollection('school').update({}, {$rename: {"studentNumber": "studentid"}})
// 將所有學生的 "score" 字段的值設置為 90,如果該字段的值大於 90,則保持不變
db.getCollection('school').update({},{$max: {score: NumberInt(90)}})
// 查詢學生記錄
db.getCollection('school').find({})
//db.school.drop()
// 插入一個名為 "mark" 的用戶記錄,包含一個 "fans" 數組字段
db.fbuser.insert({ "name" : "mark", "fans" : ["steven","crisis","stanly"] })
// 向 "fans" 數組字段中添加多個元素
db.fbuser.update({"name":"mark"},{"$push":{"fans":{"$each":["jacky","lnadry","max"]}}})
// 向 "fans" 數組字段中添加多個元素,同時限制數組的大小為 4
db.fbuser.update({"name":"mark"},{"$push":{"fans":{"$each":["jacky","lnadry","max"],"$slice":4}}})
// 從 "fans" 數組字段中刪除最後一個元素
db.fbuser.update({"name":"mark"},{"$pop":{"fans":1}})
// 從 "fans" 數組字段中移除指定元素 "crisis"
db.fbuser.update({"name":"mark"},{"$pull":{"fans":"crisis"}})
## 牛刀小試(一)

show dbs
use mongo_class
db.school.insert([{ _id: "001", studentNumber: "102418099", studentName: "小明", score: 50},
{ _id: "002", studentId: "102418098", studentName: "小華", score: 80},
{ _id: "003", studentId: "102418097", studentName: "小花", score: 120}])
// 將 "studentNumber" 字段更名為 "studentId"
db.getCollection('school').update({}, {$rename: {"studentNumber": "studentId"}})
// 將 "score" 字段的值大於 100 的記錄的 "score" 字段值設置為 100
db.getCollection('school').update({"score": {"$gt": 100}}, {"$set": {"score": 100}})
//將它們的score字段的值設置為100,但只有當原始值小於100時才進行更新。
db.getCollection('school').update({},{$min:{"score":NumberInt(100)}}, {multi:true})
// 插入一個集合 "number_group",包含一個文檔
db.number_group.insert([{_id:"4-9_01", name:"江小于", age:22, phone:"0967-481-146"},
{_id:"4-9_02", name:"穆小蓉", age:18, phone:"0989-153-149"},
{_id:"4-9_03", name:"陳小昇", age:24, phone:"0955-581-064"},
{_id:"4-9_04", name:"傅小彰", age:25, phone:"0967-058-845"},
{_id:"4-9_05", name:"廖小健", age:28, phone:"0989-758-138"},
{_id:"4-9_06", name:"陳小翰", age:31, phone:"0989-051-129"},
{_id:"4-9_07", name:"鄭小瀚", age:27, phone:"0967-984-852"},
{_id:"4-9_08", name:"梁小瑋", age:21, phone:"0989-748-913"},
{_id:"4-9_09", name:"陳小鴻", age:22, phone:"0955-685-846"},
{_id:"4-9_10", name:"陳小豪", age:20, phone:"0955-648-843"}])
// 插入一個包含數組字段 "list" 的文檔
db.number_group.insert({_id:"001",list:[30,40,50]})
// 向 "list" 數組字段中添加一個元素 80
db.number_group.update({ _id: "001" }, { $push: { list: NumberInt(80) } }, {multi:true, upsert:false})
//db.number_group.update({ _id: "001" }, { $push: { list: 60 } })
// 將多個元素 [60, 60, 70] 添加到 "list" 數組字段中
db.number_group.update({ _id: "001" }, { $push: { list: { $each: [60, 60, 70] } } }, {multi:true, upsert:false})
// 從 "list" 數組字段中刪除最後一個元素
db.number_group.update({ _id: "001" }, { $pop: { list: 1 } }, {multi:true, upsert:false})
// 從 "list" 數組字段中刪除第一個元素
db.number_group.update({_id: "001"}, { $pop: { list: -1 } }, {multi:true, upsert:false})
// 從 "list" 數組字段中移除所有值為 60 的元素
db.number_group.update({_id: "001"}, { $pull: { list: 60 } }, {multi:true, upsert:false})
db.number_group.drop()
## 牛刀小試(二)

// 將多個文檔插入到 "drink" 集合中
db.drink.insert([
{ _id: "001", product: "日月潭紅茶", type: "tea", price: {M:20,L:30}, sold:0, log:[] },
{ _id: "002", product: "金鑽鳳梨綠", type: "fruit", price: {M:40,L:50}, sold:0, log:[] },
{ _id: "003", product: "黑糖粉圓鮮奶", type: "tea latte", price: {M:50,L:65}, sold:0, log:[] }
])
// 對 _id 為 "001" 的文檔進行更新,增加 sold 字段的值 20,同時將一個新的對象 {time: Date.now(), size: 'M'} 添加到 log 字段的陣列中。使用 $push 操作符將對象添加到陣列的末尾。 upsert 設置為 false,表示如果文檔不存在則不進行插入。
db.drink.update({ _id: "001" },{$inc: { sold: 20 },$push: { log: {time:Date.now(),size:'M'} } },{upsert:false})
db.drink.update({ _id: "002" },{$inc: { sold: 40 },$push: { log: {time:Date.now(),size:'M'} } },{upsert:false})
db.drink.update({ _id: "003" },{$inc: { sold: 65 },$push: { log: {time:Date.now(),size:'L'} } },{upsert:false})
// 刪除 "drink" 集合中的所有文檔
db.drink.drop()







## 牛刀小試(三)

use mongo_class
db.contacts.insert([{_id:"4-9_01", name:"江小于", age:22, phone:"0967-481-146"},
{_id:"4-9_02", name:"穆小蓉", age:18, phone:"0989-153-149"},
{_id:"4-9_03", name:"陳小昇", age:24, phone:"0955-581-064"},
{_id:"4-9_04", name:"傅小彰", age:25, phone:"0967-058-845"},
{_id:"4-9_05", name:"廖小健", age:28, phone:"0989-758-138"},
{_id:"4-9_06", name:"陳小翰", age:31, phone:"0989-051-129"},
{_id:"4-9_07", name:"鄭小瀚", age:27, phone:"0967-984-852"},
{_id:"4-9_08", name:"梁小瑋", age:21, phone:"0989-748-913"},
{_id:"4-9_09", name:"陳小鴻", age:22, phone:"0955-685-846"},
{_id:"4-9_10", name:"陳小豪", age:20, phone:"0955-648-843"}])
db.contacts.drop()
// 查找名字以 "陳" 開頭並且電話包含 "0955" 的文檔,並按年齡升序排序
db.contacts.find({ name: /^陳/, phone: /0955/ }).sort({ age: 1 })