1. 程式人生 > >Mongo學習筆記

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 展示當前資料庫中的集合