1. 程式人生 > >NodeJS簡易部落格系統(三)MongoDB入門學習

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(
<query>,
<justOne>
)

justOne傳入刪除的個數,如果remove中傳入{}即為刪除所有資料。

5、select

db.collection.find(query, projection)
  • query :可選,使用查詢操作符指定查詢條件
  • projection :可選,使用投影操作符指定返回的鍵。查詢時返回文件中所有鍵值, 只需省略該引數即可(預設省略)。

6、update

db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
  • 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

 

常用如下:
$gt -------- greater than >
$gte --------- gt equal >=
$lt -------- less than <
$lte --------- lt equal <=
$ne ----------- not equal !=
$eq -------- equal =


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了。。