MongoDB 常用基本命令
阿新 • • 發佈:2018-12-24
mongoDB 資料庫
mongoDB 資料庫概念
MongoDB的一個例項可以擁有一個或多個相互獨立的資料庫,每個資料庫都有自己的集合。
集合
集合可以看作是擁有動態模式的表。
文件
文件是MongoDB中基本的資料單元,類似關係型資料庫表的行。
文件是鍵值對的一個有序集合。
_id
每個文件都有個特殊的"_id",在文件所屬集合中是唯一的。
mongo命令 連結MongoDB 資料庫時 會進入 javascript shell
MongoDB自帶了一個功能強大的JavaScript Shell,可以用於管理或操作MongoDB。
資料庫命名規則
* 1:不能是空串。
* 2:不得含有/、\、?、$、空格、空字元等等,基本只能使用ASCII中的字母和數字 。
* 3:區分大小寫,建議全部小寫。
* 4:最多為64位元組。
* 5:不得使用保留的資料庫名,比如:admin,local,config
注意:資料庫最終會成為檔案,資料庫名就是檔案的名稱。
集合名稱定義規則
1: 不能是空串。
2: 不能包含\0字元(空字元),這個字元表示集合名的結束,也不能包含”$”。
3: 不能以”system.”開頭,這是為系統集合保留的字首
文件的key定義規則
* 1: 不能包含\0字元(空字元),這個字元表示鍵的結束。 * 2: “.”和“$”是被保留的,只能在特定環境下用。 * 3: 區分型別,同時也區分大小寫。 * 4: 鍵不能重複 注意:文件的鍵值對是有順序的,相同的鍵值對如果有不同順序的話,也是不同的文件。
資料庫操作
顯示現有的資料庫。
show dbs
leyue 0.078GB
local 0.078GB
mongo 0.078GB
mycol 0.078GB
mydb 0.078GB
testdb 0.078GB
顯示當前使用的資料。
db
切換當前使用的資料庫。
use leyue
建立資料庫
use 資料庫名稱
db.集合名稱.insert({"name":"wang wu"})
建立資料庫:MongoDB沒有專門建立資料庫的語句,可以使用“use ” 來使用某個資料庫,如果要使用
的資料庫不存在,那麼將會建立一個,會在真正向該庫加入文件後,儲存成為檔案。
刪除資料庫
use 資料庫名稱
db.dropDatabase()
集合的操作
建立集合
建立集合:在MongoDB中不用建立集合,因為沒有固定的結構,直接使用db.集合名稱.命令 來操作就可
以了。如果非要顯示建立集合的話,用:db.createCollecion(“集合名稱”);
顯示現有的集合
use leyue
show collections
insert 可以插入一個用{} 多條資料用[]
db.userdatas.insert([ {"name":'lisan',"age":23},{"name":"wang wu","age":33} ])
1:MongoDB會為每個沒有“_id”欄位的文件自動新增一個”_id”欄位
2:每個Doc必須小於16MB
刪除文件 db.集合.remove()
db.userdatas.remove({"name":"lisan"})
檢視資料庫 文件狀態 可以看到文件的個數大小 等等資訊
資料庫: db.stats()
文件:db.集合.stats
db.stats()
{
"db" : "leyue",
"collections" : 4,
"objects" : 418,
"avgObjSize" : 110.77511961722487,
"dataSize" : 46304,
"storageSize" : 192512,
"numExtents" : 6,
"indexes" : 2,
"indexSize" : 32704,
"fileSize" : 67108864,
"nsSizeMB" : 16,
"extentFreeList" : {
"num" : 0,
"totalSize" : 0
},
"dataFileVersion" : {
"major" : 4,
"minor" : 22
},
"ok" : 1
}
db.userdatas.stats()
{
"ns" : "leyue.userdatas",
"count" : 11,
"size" : 1040,
"avgObjSize" : 94,
"numExtents" : 1,
"storageSize" : 8192,
"lastExtentSize" : 8192,
"paddingFactor" : 1,
"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
"userFlags" : 1,
"capped" : false,
"nindexes" : 1,
"totalIndexSize" : 8176,
"indexSizes" : {
"_id_" : 8176
},
"ok" : 1
}
檢視集合中所有的文件
db.集合名稱.find();
db.userdatas.find()
{ "_id" : ObjectId("59789a56bc629e73c4f09e1c"), "name" : "wang wu", "age" : 45 }
{ "_id" : ObjectId("59789a74bc629e73c4f09e1e"), "name" : "wang wu", "age" : 8 }
{ "_id" : ObjectId("59789ac0bc629e73c4f09e20"), "name" : "wang wu", "age" : 33 }
{ "_id" : ObjectId("597f357a09c84cf58880e40e"), "name" : "u1", "age" : 37 }
文件替換 db.集合名稱.update(條件,新的文件);只會修改符合條件的第一個文件。
db.test.update({"age":12},{"address":"北京","name":"老王"})
$set :指定一個欄位的值,如果欄位不存在,會建立一個.
db.test.update({"name":"u1"},{"$set":{"name":"u2"}},0,1)
$unset :刪掉某個欄位
db.test.update({"name":"u1"},{"$unset":{"address":1}},0,1)
$push:向已有陣列的末尾加入一個元素,要是沒有就新建一個數組。
db.test.update({"name":"u1"},{"$push":{"score":2}},0,1)
each:通過一次 push來操作多個值
db.test.update({"name":"u1"},{"$push":{"score":{"$each":[4,5,6]}}})
save方法
如果文件存在就更新,不存在就新建,主要根據”_id”來判斷。
db.test.save({"name":"li si"})
update
第三個引數 0 表示查詢不到,不增加一個文件 1表示查詢不到,增加文件
第四個引數 0 表示只更新第一個 1 更新所有查詢到的文件
1:只能用在$XXX的操作中
2:最好每次都顯示的指定update的第4個引數,以防止伺服器使用預設行為
find
find(條件,顯示的欄位)
db.userdatas.find({},{name:1,_id:0})
比較操作:lt, lte,gt, gte,$ne
db.userdatas.find({age:{$gte:35}})
30<=age<=35
db.userdatas.find({age:{$lte:35,$gte:30}})
$and:包含多個條件,他們之間為and的關係
db.userdatas.find({"name":"u5",age:{$gt:33}})
db.userdatas.find({$and:[{"name":"u5"},{age:{$gt:33}}]})
$or :包含多個條件,他們之間為or的關係 ,$nor相當於or取反
db.userdatas.find({$or:[{"name":"u5"},{age:{$gt:33}}]})
$not:用作其他條件之上,不能作為頂級查詢,後面可跟條件,正則
db.userdatas.find({age:{$not:{$lt:35}}})
db.userdatas.find({name:{$not:/wang/}})
$mod:將查詢的值除以第一個給定的值,如果餘數等於等二個值則匹配成功。
db.userdatas.find({age:{$mod:[10,7]}})
db.userdatas.find({age:{$not:{$mod:[10,7]}}})
in:查詢一個鍵的多個值,只要鍵匹配其中一個即可, nin為不包含
db.userdatas.find({age:{$in:[33,35]}})
db.userdatas.find({age:{$nin:[33,35]}})
$all:鍵需要匹配所有的值,用於陣列
db.userdatas.find({score:{$all:[7,4]}})
$exists:檢查某個鍵是否存在,1表示存在,0表示不存在
db.userdatas.find({"score":{$exists:1}})
null型別:不僅能匹配鍵的值為null,還匹配鍵不存在的情況
db.userdatas.find({score:null})
db.userdatas.find({name:{$in:[null],$exists:1}})
正則
MongoDB使用Perl相容的正則表示式(PCRE),
比如: db.users.find({“name”:/sishuok/i});
又比如: db.users.find({“name”:/^sishuok/});
陣列搜尋
單個元素匹配,就跟前面寫條件一樣,{key:value}
db.userdatas.find({score:0})
多個元素匹配,使用$all, {key:{$all:[a,b]}},元素的順序無所謂
db.userdatas.find({score:{$all:[2,0]}})
可以使用索引指定查詢陣列特定位置, {“key.索引號”:value}
db.userdatas.find({"score.0":7}) 索引從0開始
查詢某個長度的陣列,使用$size
db.userdatas.find({"score":{$size:4}})
指定子集,使用$slice,正數是前面多少條,負數是尾部多少條,也可以指定偏
移量和要返回的元素數量,比如:$slice:[50,10]
db.userdatas.find({},{"score":{$slice:2}})
db.userdatas.find({},{"score":{$slice:-2}})
db.userdatas.find({},{"score":{$slice:[1,1]}})
可以使用來指定符合條件的任意一個數組元素,如:{”users.”:1}
db.userdatas.find({"score":{$in:[7,4]}},{"score.$":1,name:1})
$elemMatch:要求同時使用多個條件語句來對一個數組元素進行比較判斷
db.userdatas.find({score:{$elemMatch:{$gt:8,$lt:12}}})
查詢內嵌文件
1:查詢整個內嵌文件與普通查詢是一樣的 。
2:如果要指定鍵值匹配,可以使用“.” 操作符,比如:{“name.first”:”a” ,“name.last”:”b”} 。
3:如果要正確的指定一組條件,那就需要使用$elemMatch,以實現對內嵌文件的多個鍵進行匹配操作。
插入一個文件:
db.userdatas.update({"name":"u2"},{$set:{wendang:{"yw":80,"xw":90}}})
查詢文件:
db.userdatas.find({"wendang.yw":80})
查詢記錄條數的命令:count
1,直接使用count()的話,得到的是整個記錄的條數。
2,如果要獲取按條件查詢後記錄的條數,需要指定count(true 或者非0 的數)
db.userdatas.find().count()
db.userdatas.find().limit(2).count(true)
限制返回的記錄條數的命令:limit(要返回的條數)
db.userdatas.find().limit(2)
限制返回的記錄條數起點的命令:skip(從第幾條開始返回)
db.userdatas.find().skip(0).limit(2)
排序的命令:sort({要排序的欄位:1為升序,-1為降序})
db.userdatas.find().sort({age:-1})
db.userdatas.find().sort({age:-1}).limit(2)
分頁
分頁查詢:組合使用limit,skipt和sort skip 效率低
當然也可以使用其他方式來分頁,比如採用自定義的id,然後根據id來分頁
查詢給定鍵的所有不重複的資料,命令:distinct
語法:db.runCommand({“distinct”:集合名,“key”:”獲得不重複資料的欄位”});
db.runCommand({"distinct":"userdatas","key":"age"})
db.runCommand({"distinct":"userdatas","key":"age"})
{
"waitedMS" : NumberLong(0),
"values" : [
45,
8,
33,
37,
78,
32,
30,
20
],
"stats" : {
"n" : 11,
"nscanned" : 0,
"nscannedObjects" : 11,
"timems" : 0,
"planSummary" : "COLLSCAN"
},
"ok" : 1
}
遊標
1:獲取遊標,示例如下:
var c = db.users.find();
2:循環遊標,可以用集合的方式,示例如下:
while(c.hasNext()){
printjson(c.next().文件鍵);
}
3:也可以使用forEach來迴圈,示例如下:
c.forEach(function(obj){
print(obj);
});