Mongo學習筆記
MongoDB中將表稱為集合,將行稱為文件,將列稱為欄位
Robo客戶端雙擊表出現下圖所示頁面,展示這個表裡的所有資料
(1)建立集合
db.createCollection(“集合名”),若當前使用者許可權較高,先切換到對應資料庫,eg:use test
eg:db.createCollection(“weijie_test”)
可以建立固定大小的集合
欄位 |
型別 |
描述 |
capped |
布林 |
(可選)若為true,則建立固定大小的集合,當達到最大值時,自動覆蓋最早的文件。若為true,必須指定size引數。 |
autoIndexId |
布林 |
(可選)若為true,自動在_id欄位建立索引。預設false |
size |
數值 |
(可選)為固定集合指定最大值(以位元組計)。 |
max |
數值 |
(可選)指定固定集合中包含文件的最大數量。 |
直接插入資料到一個不存在的集合也能夠自動建立集合
(2)刪除集合
db.集合名.drop()
eg:db.weijie_test.drop()
(3)插入
db.collectionName.insert({key1:’value1’,key2,:value2})
若集合原來不存在,則插入操作會建立一個集合並插入資料;
若多次插入的資料欄位數量不一致,比如集合裡原來只有5個欄位,在某次插入時插入了6個欄位,則集合會變成6個欄位,之前只有5個欄位的文件會自動補上這個欄位,但是記錄是空(不是null)
eg:db.weijie_test.insert({name:’zhangsan’,age:18,sex:’man’,company:’yoyo’,department:’IT’,province:’hubei’})
也可以先定義一個物件,物件的內容是集合的欄位和值,json格式,然後使用插入插入語句,傳遞物件,eg:
document=({name:'lisi',age:20,sex:'woman',company:'hoho',department:'develop',province:'shanxi'})
db.weijie_test.insert(document)
還可以使用db.weijie_test.save(document)完成插入,如果不指定_id,save()類似insert(),如果指定_id,則會更新該條記錄
插入多條記錄時,每條記錄用{}包含,然後將所有的記錄用[]包含(若不用[]會拋異常),eg:
db.weijie_test.insert([{name:'wangwu',age:18,sex:'man',company:'yoyo',department:'IT',province:'hubei'},
{name:'zhaoliu',age:22,sex:'woman',company:'tt'},
{name:'enen',age:32,sex:'woman',province:'henan'}])
(4)查詢
db.collectionName.find(query,projection)
引數 |
型別 |
描述 |
query |
可選,查詢條件,若不填則查詢集合裡的所有資料 |
|
projection |
可選,指定返回的鍵,若不填則返回一條記錄 |
按某個欄位查詢這個表裡的一條記錄
db.collecionName.find({fieldName:’value’}),若要按多個欄位聯合查詢,可以在()裡面加{}填上相應欄位名和值
eg:db.weijie_test.find({name:'zhangsan'})
或者db.getCollection(‘collectionName’).find({}),find裡面不填引數時為查詢集合裡的所有資料,不帶引數時裡面的{}可以省略
db.getCollection('weijie_test').find()
與RDBMS where語句比較
操作 |
格式 |
樣例 |
RDBMS類似語句 |
= |
{key:value} |
db.weijie_test.find({age:20}) |
where age=20 |
< |
{key:{$lt:value}} |
db.weijie_test.find({age:{$lt:20}}) |
where age<20 |
<= |
{key:{$lte:value}} |
db.weijie_test.find({age:{$lte:20}}) |
where age<=20 |
> |
{key:{$gt:value}} |
db.weijie_test.find({age:{$gt:20}}) |
where age>20 |
>= |
{key:{$gte:value}} |
db.weijie_test.find({age:{$gte:20}}) |
where age>=20 |
!= |
{key:{$ne:value}} |
db.weijie_test.find({age:{$ne:20}}) |
where age!=20 |
猜測字母含義:
l:less、t:than、e:equal、g:greater、n:not
查詢條件有多個欄位表示and關係,or關係用$or
db.collectionName.find(
{
$or: [
{key1:value1}, {key2:value2}
]
}
)
eg:
db.weijie_test.find(
{
$or:[
{age:20},{department:'IT'}
]
}
)
and與or公用,eg:
db.weijie_test.find(
{company:'yoyo',
$or:[
{age:20},{department:'IT'}
]
}
)
模糊查詢
{key:/value/},指key的值包含value的記錄
{key:/^value/},指key的值以value開頭的記錄
{key:/value$/},指key的值以value結尾的記錄
(5)更新
使用update()和save()更新集合中的文件
使用update更新文件
db.collectionName.update(
<query>
<update>,
{
upsert:<boolean>,
multi:<boolean>,
writeConcern:<document>
}
)
引數 |
型別 |
描述 |
query |
查詢條件,類似sql update查詢內where後面的 |
|
update |
需要更新的物件和操作符($,$inc…)等,類似sql update查詢內set後面的 |
|
upsert |
boolean |
可選,如果不存在需要更新的記錄,是否插入新記錄,預設false |
multi |
boolean |
可選,更新時可能查到多條記錄,false為更新第一條,true為全部更新,預設false |
writeConcern |
document |
可選,丟擲異常的級別 |
eg:
db.weijie_test.update({name:'zhangsan'},{$set:{age:25}})//只會修改查到的第一條
db.weijie_test.update({name:'zhangsan'},{$set:{age:19}},{multi:true})//會修改所有查到的
使用save()更新文件
db.collectionName.save(
<document>,
{
writeConcern: <document>
}
)
引數 |
型別 |
描述 |
document |
文件變數 |
文件資料 |
writeConcern |
可選,丟擲異常的級別 |
eg:
db.weijie_test.save({
_id : ObjectId("5b9a2a514c755630fbd79a2f"),
name : "zhangsansan",
age : 56.0,
sex : "xx",
company : "mofine",
department : "IT"
})
可以看到,某個欄位不傳時,會置為空
(6)刪除
db.collectionName.remove(
<query>,
<justOne>
)
2.6以後的版本:
db.collectionName.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
引數 |
型別 |
描述 |
query |
可選,刪除文件的條件 |
|
justOne |
boolean |
可選,若設為true或1,則只刪除一條文件 |
writeConcern |
文件變數 |
可選,丟擲異常的型別 |
eg:db.weijie_test.remove({name:'zhangsansan'})
(7)資料型別
查詢某個欄位為某個資料型別的記錄,使用{$type:資料型別或對應的數字}
型別 |
數字 |
備註 |
Double |
1 |
|
String |
2 |
|
Object |
3 |
|
Array |
4 |
|
Binary data |
5 |
|
Undefined |
6 |
已廢棄 |
Object id |
7 |
|
Boolean |
8 |
|
Date |
9 |
|
Null |
10 |
|
Regular Expression |
11 |
|
JavaScript |
13 |
|
Symbol |
14 |
|
JavaScript(with scope) |
15 |
|
32-bit integer |
16 |
|
Timestamp |
17 |
|
64-bit integer |
18 |
|
Min key |
255 |
Query with-1 |
Max key |
127 |
eg:查詢集合中name欄位為String的記錄
db.weijie_test.find({name:{&type:2}})
或db.weijie_test.find({name:{&type:’string’}})
(7)排序
使用sort()排序,指定關鍵字,1為升序,-1為降序
eg:db.weijie_test.find().sort({name:1})
注:此時如果欄位填錯也不會拋異常,只是不會排序而已;升序時空欄位排前面,降序時空欄位排後面
(8)索引
db.collectionName.createIndex(keys, options)
key表示需要建立索引的欄位,1為升序,-1為降序;支援根據多個欄位建立複合索引
(9)聚合
聚合在查詢時必須指定一個欄位,該欄位又分為加$和不加的
格式:db.collectionName.aggregate([{$group:{_id:’key1’,aggregate_operation:{$operaton:’key2’}}}])
解釋:按key1查詢,按key2進行operation操作
統計某欄位的記錄條數(其實就是統計集合的所有記錄條數)
eg:db.weijie_test.aggregate([{$group:{_id:"company",num_tutorial:{$sum:1}}}])
等價於select count(company) from weijie_test//記錄中compan為空的不會計入
統計某欄位的各個值的記錄條數
eg:db.weijie_test.aggregate([{$group:{_id:"$company",num_tutorial:{$sum:1}}}])
對欄位加上$後,效果如圖:
操作 |
描述 |
舉例 |
&sum |
求和 |
db.weijie_test.aggregate([{$group:{_id:’$key1’,num_tutorial:{$sum:’$key2’}}}]) |
$avg |
求平均 |
db.weijie_test.aggregate([{$group:{_id:’$key1’,num_tutorial:{$avg:’$key2’}}}]) |
$min |
取最小值 |
db.weijie_test.aggregate([{$group:{_id:’$key1’,num_tutorial:{$min:’$key2’}}}]) |
$max |
取最大值 |
db.weijie_test.aggregate([{$group:{_id:’$key1’,num_tutorial:{$max:’$key2’}}}]) |
$push |
插入值到陣列 |
db.weijie_test.aggregate([{$group:{_id:’$key1’,url:{$push:’key2’}}}]) |
$addToSet |
插入值到陣列,但不建立副本 |
db.weijie_test.aggregate([{$group:{_id:’$key1’,url:{$addToSet:’key2’}}}]) |
$first |
根據排序獲取第一個文件資料 |
db.weijie_test.aggregate([{$group:{_id:’$key1’,first_url:{$first:’$key2’}}}]) |
$last |
根據排序獲取最後一個數據 |
db.weijie_test.aggregate([{$group:{_id:’$key2’,last_url:{$last:’$key2’}}}]) |
管道:MongoDB的聚合管道將MonoDB文件在一個管道處理完畢後將結果傳遞給下一個管道處理。
實現的效果如:只查文件的某些列(project);查詢某列在某些範圍的文件(match)
操作 |
描述 |
舉例 |
類比SQL |
$project |
修改輸入文件的結構。可重新命名、增加、刪除域,也可用於建立計算結果以及巢狀文件 |
db.weijie_test.aggregate({ $project:{ name:1,age:1,courses:1}}) |
select name,age,courses from weijie_test |
$match |
過濾資料,只展示符合範圍的資料 |
db.weijie_test.aggregate( {$match:{age:{$gte:20,$lte:35}}}) |
Select * from weijie_test where age between 20 and 35 |
$limit |
限制返回的文件數 |
||
$skip |
跳過指定數量的文件,並返回餘下文件 |
||
$unwind |
將文件文件中某個陣列型別的欄位拆成多條 |
db.weijie_test2.aggregate({ $unwind:'$courses' }) |
這裡courses欄位為空的記錄不會展示,$必須帶 |
$group |
|||
$sort |
|||
$geoNear |
(10)limit()、skip()
limit(number)用於限定記錄條數為number條
eg:db.weijie_test.find().limit(2)//查詢前2條記錄
skip(number)用於跳過number條記錄
eg:db.weijie_test.find().limit(2).skip(1)//查詢2條記錄,但是跳過第一條(返回的結果是第2條和第3條,即先執行skip)
如果sort()、limit()、skip()合用,則執行順序sort>skip>limit
文件鍵命名規範:
1、鍵不能含有\0(空字串)。這個字元表示鍵的結尾
2、.和$有特別的意義,只有特定環境下才能使用
3、以下劃線”_”開頭的鍵是保留的(不是嚴格要求的)
常用命令
show dbs 展示當前的資料庫(全新要求較高)
show collections 展示當前資料庫中的集合