NodeJS簡易部落格系統(三)MongoDB入門學習
安裝好mongodb並設定開機自啟動服務,然後安裝視覺化軟體NoSQL Manager for MongoDB Professional。
一、CRUD操作
1、建立/使用資料庫
use DATABASE_NAME |
如果資料庫不存在,則建立資料庫,否則切換到指定資料庫。
2、刪除資料庫/集合
db.dropDatabase() { "dropped" : "blog", "ok" : 1 } db.collection.drop() |
3、insert
db.user.insert({name:"ljw",age:23,sex:"男"}) |
4、delete
db.collection.remove( |
justOne傳入刪除的個數,如果remove中傳入{}即為刪除所有資料。
5、select
db.collection.find(query, projection) |
- query :可選,使用查詢操作符指定查詢條件
- projection :可選,使用投影操作符指定返回的鍵。查詢時返回文件中所有鍵值, 只需省略該引數即可(預設省略)。
6、update
db.collection.update( |
- query : update的查詢條件,類似sql update查詢內where後面的。
- update : update的物件和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內set後面的
- upsert : 可選,這個引數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,預設是false,不插入。
- multi : 可選,mongodb 預設是false,只更新找到的第一條記錄,如果這個引數為true,就把按條件查出來多條記錄全部更新。
- writeConcern :可選,丟擲異常的級別。
如更新
name為soleil的age為23
二、操作符
1、條件操作符號
如果查詢age大於20
常用如下: |
2、 $type 操作符
$type操作符是基於BSON型別來檢索集合中匹配的資料型別,並返回結果。
MongoDB 中可以使用的型別如下表所示:
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 |
如在下列資料中查詢name為string型別的資料:
三、聚合
1、aggregate() 方法
MongoDB中聚合(aggregate)主要用於處理資料(諸如統計平均值,求和等),並返回計算後的資料結果。有點類似sql語句中的 count(*)。語法如下:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION) |
在user表中有如下資料:
使用聚合查詢語句
db.user.aggregate([{$group : {_id : "$sex", num_total : {$sum : 1}}}]) |
得到如下結果:
其實就相當於MySQL中的select sex, count(*) from user group by sex.
常用的聚合的表示式如下:
表示式 | 描述 | 例項 |
---|---|---|
$sum | 計算總和。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | 計算平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | 獲取集合中所有文件對應值得最小值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | 獲取集合中所有文件對應值得最大值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | 在結果文件中插入值到一個數組中。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | 在結果文件中插入值到一個數組中,但不建立副本。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | 根據資源文件的排序獲取第一個文件資料。 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last | 根據資源文件的排序獲取最後一個文件資料 | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
2、管道
管道在Unix和Linux中一般用於將當前命令的輸出結果作為下一個命令的引數。
MongoDB的聚合管道將MongoDB文件在一個管道處理完畢後將結果傳遞給下一個管道處理。管道操作是可以重複的。
表示式:處理輸入文件並輸出。表示式是無狀態的,只能用於計算當前聚合管道的文件,不能處理其它的文件。
這裡我們介紹一下聚合框架中常用的幾個操作:
- $project:修改輸入文件的結構。可以用來重新命名、增加或刪除域,也可以用於建立計算結果以及巢狀文件。
- $match:用於過濾資料,只輸出符合條件的文件。$match使用MongoDB的標準查詢操作。
- $limit:用來限制MongoDB聚合管道返回的文件數。
- $skip:在聚合管道中跳過指定數量的文件,並返回餘下的文件。
- $unwind:將文件中的某一個數組型別欄位拆分成多條,每條包含陣列中的一個值。
- $group:將集合中的文件分組,可用於統計結果。
- $sort:將輸入文件排序後輸出。
- $geoNear:輸出接近某一地理位置的有序文件。
如統計年齡在17到24之間的資料條數:
3、Map Reduce
Map-Reduce是一種計算模型,簡單的說就是將大批量的工作(資料)分解(MAP)執行,然後再將結果合併成最終結果(REDUCE)。
語法:
db.collection.mapReduce( function() {emit(key,value);}, //map 函式 function(key,values) {return reduceFunction}, //reduce 函式 { out: collection, query: document, sort: document, limit: number } ) |
使用 MapReduce 要實現兩個函式 Map 函式和 Reduce 函式,Map 函式呼叫 emit(key, value), 遍歷 collection 中所有的記錄, 將key 與 value 傳遞給 Reduce 函式進行處理。
Map 函式必須呼叫 emit(key, value) 返回鍵值對。
引數說明:
- map :對映函式 (生成鍵值對序列,作為 reduce 函式引數)。
- reduce 統計函式,reduce函式的任務就是將key-values變成key-value,也就是把values陣列變成一個單一的值value。。
- out 統計結果存放集合 (不指定則使用臨時集合,在客戶端斷開後自動刪除)。
- query 一個篩選條件,只有滿足條件的文件才會呼叫map函式。(query。limit,sort可以隨意組合)
- sort 和limit結合的sort排序引數(也是在發往map函式前給文件排序),可以優化分組機制
- limit 發往map函式的文件數量的上限(要是沒有limit,單獨使用sort的用處不大)
現在,我們將在 user集合中使用 mapReduce 函式來選取已釋出的文章(sex:"女"),並通過name分組,計算每個使用者的sex數:
可以看到有兩個sex為"女"的使用者並分為兩個鍵值對。還可以在該語句後使用find()來查詢分類的結果:
掌握了這些就能基本使用MongoDB了。。