1. 程式人生 > 資料庫 >MongoDB基本語句練習

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: \"灝忚姳\" }"
        }
})
# 會直接報錯,因為 小花 已經存在了