MongoDB基本語句練習
文章目錄
注:語句前帶 > ,說明是在mongo下執行的命令,後面資料即是該語句返回的結果
課時一:MongoDB基本使用
1.啟動mongo
mongo
2.顯示所有資料庫
show dbs
show databases
3.顯示集合
show collections
4.選擇庫
use dept
5.定義一個變數
var deptData = {
"deptno": 20,
"dname": "產品部",
"loc": "深圳",
"count": 20,
"avg":8000.0
};
6.插入資料
db.dept.insert(deptData)
7.顯示集合所有資料
db.dept.find()
8.顯示一條資料
db.dept.findOne()
9.刪除資料
db.dept.remove({"dname": "產品部"})
10.刪除集合
db.dept.drop()
11.刪除資料庫(當前所在的資料庫)
db.dropDatabase()
課時二:資料增加 JSON格式#
使用“db.集合.insert()” 可以實現資料的增加操作
1.範例:增加一個簡單的資料
db.infos.insert({"url":"www.baidu.com"});
2.範例:增加多個數據,使用陣列
db.infos.insert([ {"url":"www.google.com"}, {"url":"www.360.com"} ]);
3.檢視集合內容
> db.infos.find()
{ "_id" : ObjectId("5ff414f18be29a67668e3828"), "url" : "www.baidu.com" }
{ "_id" : ObjectId("5ff416688be29a67668e3829"), "url" : "www.google.com" }
{ "_id" : ObjectId("5ff416688be29a67668e382a"), "url" : "www.360.com" }
4.範例:增加一萬條資料
for(var x = 0 ; x<10000 ; x++){ db.infos.insert({"url":"www."+ x +".com"}); }
如果使用find檢視內容較多,列表不會全部列出,只會列出一部分
課時三:資料查詢 JSON格式#
使用 db.infos.find() 可以實現查詢操作
1.範例:查詢url為“www.baidu.com”的資料
>db.infos.find({"url":"www.baidu.com"})
{ "_id" : ObjectId("5ff414f18be29a67668e3828"), "url" : "www.baidu.com" }
2.範例:查詢的資料不顯示 “_id”
> db.infos.find({"url":"www.baidu.com"},{"_id":0})
{ "url" : "www.baidu.com" }
3.範例:使用函式 pretty() 漂亮顯示
db.infos.find({"url":"www.baidu.com"},{"_id":0}).pretty()
課時四:where查詢
1.補充資料
for(var x = 20 ; x<30 ; x++){
db.student.insert({"name":"stu"+(x-19),"age":x});
}
2.查詢年齡大於 28 的資料
db.student.find({"$where":"this.age>28"}).pretty()
{
"_id" : ObjectId("5ff41e418be29a67668e5f44"),
"name" : "stu10",
"age" : 29
}
3.也可以省略$where
db.student.find("this.age>28").pretty()
4.實際上以上程式碼嚴格來講是屬於一個操作的函式 js
db.student.find(
function(){
return this.age > 28;
}
).pretty();
5.多個條件判斷,需要使用$and 查詢年齡大於19小於22的資料,不顯示_id
>db.student.find(
{"$and":[
{"$where":"this.age>19"},
{"$where":"this.age<22"}
]},{"_id":0}
)
{ "name" : "stu1", "age" : 20 }
{ "name" : "stu2", "age" : 21 }
課時五 :正則查詢
如果想要實現模糊查詢,那麼必須使用正則表達
基礎語法:{key : 正則標記}
完整語法:{key : {“
r
e
g
e
x
"
:
正
則
標
記
,
"
regex":正則標記 , "
regex":正則標記,"options”:選項} }
對於options主要是設定正則的資訊查詢的標記
“i” :忽略字母大小寫
“m” :多行查詢
“x” :空白字串除了轉義的或字元類中意外的完全被忽略
“s” :匹配所有的字元,包括換行內容
1.範例:查詢姓名有字母a/A (i忽略大小寫)
db.student.find({"name":{$regex:/A/i}})
db.student.find( {"name":/a/i} ).pretty()
2.範例:查詢陣列資料 課程帶“語”的
db.student.find("course":/語/)
課時六 :資料排序
資料排序操作使用sort()函式,升序(1) , 降序(-1)
1.範例:學生的成績降序
db.student.find().sort({"score":-1}).pretty()
在排序的過程有一種方式稱為自然排序,按照資料儲存的先後順序排序
使用"$natural"
2.範例:自然排序
db.student.find().sort({"$natural":-1}).pretty()
課時七:分頁控制
skip(n) : 表示跨過多少資料行
imit(n) : 取出的資料行的個數限制
1.範例:分頁顯示(第一頁)
> db.infos.find().skip(0).limit(3).sort({"$natural":1}).pretty()
{ "_id" : ObjectId("5ff414f18be29a67668e3828"), "url" : "www.baidu.com" }
{ "_id" : ObjectId("5ff416688be29a67668e3829"), "url" : "www.google.com" }
{ "_id" : ObjectId("5ff416688be29a67668e382a"), "url" : "www.360.com" }
2.範例:分頁顯示(第二頁)
> db.infos.find().skip(3).limit(3).sort({"$natural":1}).pretty()
{ "_id" : ObjectId("5ff417dd8be29a67668e382b"), "url" : "www.0.com" }
{ "_id" : ObjectId("5ff417dd8be29a67668e382c"), "url" : "www.1.com" }
{ "_id" : ObjectId("5ff417dd8be29a67668e382d"), "url" : "www.2.com" }
課時八:資料更新
在MongoDB對於資料的更新提供了兩類函式:update() 、save()
update語法:db.集合.update(更新條件 , 新的物件資料 , upsert , multi);
upsert : 如果更新的資料不存在,則增加一條新的內容(true為增加,false不增加)
multi : 表示是否只更新滿足條件的第一行記錄(如果設定false,只更新第一行,true全部更新)
1.範例:更新存在的資料——將年齡為20歲的人的姓名更新為xx
#只更新第一條
db.student.update({"age":20} , {"$set":{"name":"xx"}},false , false)
# 所有滿足條件的資料都更新
db.student.update({"age":20} , {"$set":{"name":"xx"}},false , true)
2.範例:更新不存在的資料
> db.student.update({"age":101},{"$set":{"name":"不存在"}},true,false)
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5ff520940f3db5f6aef156f9")
})
# 可以發現,匹配資料0 , 插入資料1 , 修改資料0
> db.student.find({"name":"不存在"},{"_id":0})
{ "age" : 101, "name" : "不存在" }
save()方法
1.範例:王小明的資料修改為李小紅:
db.student.save({
"_id" :1,
"name" : "李小紅",
"sex" : "女",
"hobbies" : [
"畫畫",
"唱歌",
"跳舞"
],
})
注:如果save()指定了_id,則對文件進行更新;
未指定_id則會執行插入功能,MongoDB預設自動生成一個不重複的_id
update()方法適用於修改某條資料中的某個鍵值;
save()方法適用於修改整條資料。
課時九:修改器
之前使用的"$set" 就是一個修改器
1.$inc : 主要針對一個數字欄位,增加某個數字欄位的資料內容
# 範例:將年齡為20歲的學生成績一律減30分,年齡加1歲
db.student.update({"age":20},{"$inc":{"score":-30,"age":1}})
2.$set : 進行內容的重新設定
3.$unset : 刪除某個成員的內容
# 範例:刪除年齡為20歲的成績資訊
db.student.update({"age":21},{"$unset":{"score":1}})
4.$push : 相當於將內容追加到指定的成員之中(基本上是陣列)
# 範例:向年齡為21歲的同學新增課程資訊
db.student.update({"age":21},{"$push":{"course":["數學","語文"]}})
# 注:如果沒有陣列,進行一個新的陣列建立,else ,進行內容的追加
5.$pushAll : 與"$push"是類似的,可以一次追加多個內容到數組裡面
# 範例:向"小明"的資訊裡面新增多個課程內容
db.student.update({"name":"小明"},{"$pushAll":{"course":["音樂","美術"]}})
6.$addToSet : 向數組裡面增加一個新的內容,只有內容不存在的時候才會增加
7.$pop : 刪除陣列內的資料
# 語法:{"$pop":{成員:內容}} ,如果內容為-1表示刪除第一個,1刪除最後一個
db.student.update({"name":"xx"},{"$pop":{"course":1}})
8.$pull : 從陣列內刪除一個指定內容的資料
# 語法:{"$pull":{成員:資料}}
9.$pullAll : 一次性刪除多個
# 語法:{"$pullAll":{成員:[資料,資料...]}}
10.$rename : 為成員名稱重新命名
# 語法:{"$rename":{"舊的成員名稱":"新的成員名稱"}}
課時十:資料刪除
1.範例:清空infos集合中的內容
db.infos.remove({})
2.範例:刪除所有姓名帶有“1”的資訊
db.student.remove({"name":/1/})
3.範例:刪除姓名帶有“2”的資訊,只刪除一個
db.student.remove({"name":/2/},true)
課時十一:關係運算
小於 : $lt 大於 : $gt 小於等於 : $lte 大於等於 : $gte 不等於 : n e 等 於 : ne 等於: ne等於:eq
1.範例:查詢年齡大於20歲的同學
> db.student.find({"age":{$gt:20}},{"_id":0})
{ "name" : "小紅", "sex" : "女", "age" : 22, "score" : 99, "address" : "長沙縣" }
{ "name" : "張蘭", "sex" : "女", "age" : 21, "score" : 69, "address" : "望城區" }
{ "name" : "小丫", "sex" : "女", "age" : 21, "score" : 67, "address" : "開福區" }
{ "name" : "小小", "sex" : "男", "age" : 22, "score" : 85, "address" : "芙蓉區" }
{ "name" : "小雞", "sex" : "女", "age" : 21, "score" : 92, "address" : "芙蓉區" }
課時十二:邏輯運算
邏輯運算主要三種:與($and)、或($or)、非($not、$nor)
1.範例:查詢年齡在19-20歲的資訊
> db.student.find({"age":{"$gte":19 , "$lte":20}},{"_id":0})
{ "name" : "小三", "sex" : "男", "age" : 19, "score" : 89, "address" : "嶽麓區" }
{ "name" : "小花", "sex" : "女", "age" : 20, "score" : 75, "address" : "嶽麓區" }
{ "name" : "小明", "sex" : "男", "age" : 19, "score" : 55, "address" : "天心區" }
{ "name" : "小四", "sex" : "男", "age" : 20, "score" : 69, "address" : "開福區" }
{ "name" : "小狗", "sex" : "男", "age" : 20, "score" : 76, "address" : "雨花區" }
{ "name" : "小豬", "sex" : "男", "age" : 19, "score" : 96, "address" : "雨花區" }
2.範例:查詢年齡大於20或者分數高於90的資訊
>db.student.find({"$or":[
{"age":{"$gt":20}},
{"score":{"$gt":90}}
]},{"_id":0})
{ "name" : "小紅", "sex" : "女", "age" : 22, "score" : 99, "address" : "長沙縣" }
{ "name" : "張蘭", "sex" : "女", "age" : 21, "score" : 69, "address" : "望城區" }
{ "name" : "小丫", "sex" : "女", "age" : 21, "score" : 67, "address" : "開福區" }
{ "name" : "小小", "sex" : "男", "age" : 22, "score" : 85, "address" : "芙蓉區" }
{ "name" : "小雞", "sex" : "女", "age" : 21, "score" : 92, "address" : "芙蓉區" }
{ "name" : "小豬", "sex" : "男", "age" : 19, "score" : 96, "address" : "雨花區" }
3.範例:也可以進行或的取反操作(年齡不大於20或分數不高於90)
>db.student.find({"$nor":[
{"age":{"$gt":20}},
{"score":{"$gt":90}}
]},{"_id":0})
{ "name" : "小三", "sex" : "男", "age" : 19, "score" : 89, "address" : "嶽麓區" }
{ "name" : "小花", "sex" : "女", "age" : 20, "score" : 75, "address" : "嶽麓區" }
{ "name" : "小明", "sex" : "男", "age" : 19, "score" : 55, "address" : "天心區" }
{ "name" : "小草", "sex" : "女", "age" : 18, "score" : 80, "address" : "天心區" }
{ "name" : "小樹", "sex" : "女", "age" : 18, "score" : 90, "address" : "嶽麓區" }
{ "name" : "小四", "sex" : "男", "age" : 20, "score" : 69, "address" : "開福區" }
{ "name" : "小狗", "sex" : "男", "age" : 20, "score" : 76, "address" : "雨花區" }
課時十三:模運算、範圍運算
模的運算使用"$mod" 來完成,語法"{$mod:[數字,餘數]}"
1.範例:年齡對20取模餘1
> db.student.find({"age":{"$mod":[20,1]}},{"_id":0})
{ "name" : "張蘭", "sex" : "女", "age" : 21, "score" : 69, "address" : "望城區" }
{ "name" : "小丫", "sex" : "女", "age" : 21, "score" : 67, "address" : "開福區" }
{ "name" : "小雞", "sex" : "女", "age" : 21, "score" : 92, "address" : "芙蓉區" }
*範圍查詢 "$in"(在範圍之中),"$nin"(不在範圍之中)*
2.範例:查詢姓名是 [小花,小草,小蘭] 的資訊
> db.student.find({"name":{"$in":["小花","小草","小小"]}},{"_id":0})
{ "name" : "小花", "sex" : "女", "age" : 20, "score" : 75, "address" : "嶽麓區" }
{ "name" : "小草", "sex" : "女", "age" : 18, "score" : 80, "address" : "天心區" }
{ "name" : "小小", "sex" : "男", "age" : 22, "score" : 85, "address" : "芙蓉區" }
課時十四:陣列運算
針對於陣列資料進行判斷,可以使用:"$all"、"$size"、"$slice"、"$elemMatch"
1.範例:查詢同時參加語文和表演課程的學生
> db.student.find({"course":{"$all":["語文","表演"]}},{"_id":0,"address":0,"score":0})
{ "name" : "小小花", "sex" : "女", "age" : 20, "course" : [ "語文", "數學", "音樂", "表演" ] }
{ "name" : "小小樹", "sex" : "男", "age" : 19, "course" : [ "語文", "音樂", "表演" ] }
{ "name" : "小小狗", "sex" : "女", "age" : 20, "course" : [ "語文", "表演" ] }
{ "name" : "小小吖", "sex" : "男", "age" : 22, "course" : [ "語文", "表演" ] }
2.範例:查詢陣列中第二個內容(index=1,下標從0開始)為數學的資訊
> db.student.find({"course.1":"數學"},{"_id":0,"address":0,"score":0})
{ "name" : "小小花", "sex" : "女", "age" : 20, "course" : [ "語文", "數學", "音樂", "表演" ] }
{ "name" : "小小草", "sex" : "女", "age" : 22, "course" : [ "語文", "數學", "音樂" ] }
3.範例:查詢只參加三門課程的學生
> db.student.find({"course":{"$size":3}},{"_id":0,"address":0,"score":0})
{ "name" : "小小草", "sex" : "女", "age" : 22, "course" : [ "語文", "數學", "音樂" ] }
{ "name" : "小小樹", "sex" : "男", "age" : 19, "course" : [ "語文", "音樂", "表演" ] }
4.範例:返回年齡為19歲的所有學生資訊,但是要求只顯示兩門課程
# "$slice":2 ——表示前兩門資訊 "$slice":-2 ——後兩門資訊 "$slice":[1,2] ——表示中間資訊
# "$slice":[1,2] 第一個資料表示跳過的資料量,第二個資料表示返回的資料量
> db.student.find({"age":19},{"course":{"$slice":2},"_id":0,"address":0,"score":0})
{ "name" : "小小樹", "sex" : "男", "age" : 19, "course" : [ "語文", "音樂" ] }
課時十四:巢狀元素查詢
此時給出的內容是巢狀的集合,這種集合資料的判斷只能夠通過 “$elemMatch”
1.範例:查詢出父母有人是 工人 的資訊
>db.student.find(
{"parents":{
"$elemMatch":{"job":"工人"}
}}
,{"_id":0}).pretty()
{
"name" : "大大花",
"parents" : [
{
"name" : "大花父親",
"job" : "工人",
"age" : "49"
},
{
"name" : "大花母親",
"job" : "職員",
"age" : "47"
}
]
}
{
"name" : "大大草",
"parents" : [
{
"name" : "大草父親",
"job" : "工人",
"age" : "36"
},
{
"name" : "大草母親",
"job" : "局長",
"age" : "36"
}
]
}
判斷某個欄位是否存在
使用"$exists" 可以判斷某個欄位是否存在,true為存在,false不存在
1.範例:查詢具有parents成員的資料
db.student.find({"parents":{"$exists":true}})
課時十五:唯一索引
唯一索引的主要目的是用在某一個欄位上,使該欄位的內容不重複
1.範例:建立一個唯一索引
db.student.ensureIndex({"name":1},{"unique":true})
# 表示name欄位上的內容不允許重複
2.測試:增加一條name重複的資料
> db.student.insert({"name":"小花","sex":"男"})
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: test.student index: name_1 dup key: { name: \"灝忚姳\" }"
}
})
# 會直接報錯,因為 小花 已經存在了