熟悉Linux作業系統的小夥伴們應該知道Linux中有管道的說法,可以用來方便的處理資料。 MongoDB2.2版本也引進了新的資料聚合框架,一個文件可以經過多個節點組成的管道,每個節點都有自己特殊的功能,例如文件分組、文件過濾等,每一個節點都會接受一連串的文檔,對這些文件做一些類型轉換,然後將轉換後的文件傳遞給下一個節點,最後一個節點則會將結果傳回給客戶端。本文我們就先來看幾個基本的管道操作符。
$match
$match可以用來篩選文件,篩選完成之後我們就可以在篩選得到的文檔子集上來做資料聚合操作了,我們之前介紹的查詢的運算子在$match中都可以使用,例如取得集合中所有author為"杜甫"的文檔,如下:
db.sang_collect.aggregate({$match:{author:"杜甫"}})
我們在實際使用時最好將$match放在管道的前面,這樣可以減少後面管道的工作量,同時,我們在投射和分組之前執行$match還可以用索引。
$project可以用來提取想要的字段,如下:
db.sang_collect.aggregate({$project:{title:1,_id:0}})
1表示要該字段,0表示不要該字段,也可以對返回的字段進行重命名,例如將title改為articleTitle,如下:
db.sang_collect.aggregate({$project:{"articleTitle":"$title"}})
不過這裡有一個問題需要注意,如果原字段上有索引,重命名之後的字段上就沒有索引了,因此最好在重命名之前使用索引。
數學表達式可以用來對一組數值進行加減乘除取模,例如我的資料結構如下:
{ "_id" : ObjectId("59f841f5b998d8acc7d08863"), "orderAddressL" : "ShenZhen", "prodMoney" : 45.0, "freight" : 13.0, "discounts" : 3.0, "orderDate" : ISODate("2017-10-31T09:27:17.342Z"), "prods" : [ "可乐", "奶茶" ] }
訂單的總費用為商品費用加上運費,查詢如下:
db.sang_collect.aggregate({$project:{totalMoney:{$add:["$prodMoney","$freight"]}}})
實際付款的費用是總費用減去折扣,如下:
db.sang_collect.aggregate({$project:{totalPay:{$subtract:[{$add:["$prodMoney","$freight"]},"$discounts"]}}})
再來三個無厘頭運算,例如計算prodMoney和freight和discounts的乘積:
db.sang_collect.aggregate({$project:{test1:{$multiply:["$prodMoney","$freight","$discounts"]}}})
再例如求$prodMoney和$freight的商,如下:
db.sang_collect.aggregate({$project:{test1:{$pide:["$prodMoney","$freight"]}}})
再例如用$freight對$prodMoney取模,如下:
db.sang_collect.aggregate({$project:{test1:{$mod:["$prodMoney","$freight"]}}})
加法和乘法都可以接收多個參數,其餘的都會接收兩個參數。
日期表達式可以從一個日期類型中提取出年、月、日、星期、時、分、秒等訊息,如下:
db.sang_collect.aggregate({$project:{"年份":{$year:"$orderDate"},"月份":{$month:"$orderDate"},"一年中第几周":{$week:"$orderDate"},"日期":{$dayOfMonth:"$orderDate"},"星期":{$dayOfWeek:"$orderDate"},"一年中第几天":{$dayOfYear:"$orderDate"},"时":{$hour:"$orderDate"},"分":{$minute:"$orderDate"},"秒":{$second:"$orderDate"},"毫秒":{$millisecond:"$orderDate"},"自定义格式化时间":{$dateToString:{format:"%Y年%m月%d %H:%M:%S",date:"$orderDate"}}}})
執行結果如下:
{ "_id" : ObjectId("59f841f5b998d8acc7d08861"), "年份" : 2017, "月份" : 10, "一年中第几周" : 44, "日期" : 31, "星期" : 3, "一年中第几天" : 304, "时" : 9, "分" : 27, "秒" : 17, "毫秒" : 342, "自定义格式化时间" : "2017年10月31 09:27:17" }
$dayOfWeek返回的是星期,1表示星期天,7表示星期六,$week表示本周是本年的第幾週,從0開始計。 $dateToString是MongoDB3.0+中的功能。格式化的字元還有以下幾種:
字元 | 意思 | 取值範圍 |
---|---|---|
%Y | Year (4 digits, zero padded) | 0000-9999 |
%m | Month (2 digits, zero padded) | 01-12 |
%d | Day of Month (2 digits, zero padded ) | 01-31 |
%H | Hour (2 digits, zero padded, 24-hour clock) | 00 -23 |
%M | Minute (2 digits, zero padded) | 00-59 |
%S | Second (2 digits, zero padded) | 00-60 |
%L | Millisecond (3 digits , zero padded) | 000-999 |
%j | Day of year (3 digits, zero padded) | 001- 366 |
%w | Day of week (1-Sunday, 7-Saturday) | 1-7 |
#%U | Week of year (2 digits, zero padded) | 00-53 |
以上是MongoDB管道操作符的詳細內容。更多資訊請關注PHP中文網其他相關文章!