MongoDB管道操作符

小云云
發布: 2023-03-17 20:04:01
原創
2157 人瀏覽過

熟悉Linux作業系統的小夥伴們應該知道Linux中有管道的說法,可以用來方便的處理資料。 MongoDB2.2版本也引進了新的資料聚合框架,一個文件可以經過多個節點組成的管道,每個節點都有自己特殊的功能,例如文件分組、文件過濾等,每一個節點都會接受一連串的文檔,對這些文件做一些類型轉換,然後將轉換後的文件傳遞給下一個節點,最後一個節點則會將結果傳回給客戶端。本文我們就先來看幾個基本的管道操作符。

$match

$match可以用來篩選文件,篩選完成之後我們就可以在篩選得到的文檔子集上來做資料聚合操作了,我們之前介紹的查詢的運算子在$match中都可以使用,例如取得集合中所有author為"杜甫"的文檔,如下:

db.sang_collect.aggregate({$match:{author:"杜甫"}})
登入後複製

我們在實際使用時最好將$match放在管道的前面,這樣可以減少後面管道的工作量,同時,我們在投射和分組之前執行$match還可以用索引。

$project

基本用法

$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+中的功能。格式化的字元還有以下幾種:

##

字符串表达式

字符串表达式中有字符串的截取、拼接、转大写、转小写等操作,比如我截取orderAddressL前两个字符返回,如下:

db.sang_collect.aggregate({$project:{addr:{$substr:["$orderAddressL",0,2]}}})
登入後複製

再比如我将orderAddressL和orderDate拼接后返回:

db.sang_collect.aggregate({$project:{addr:{$concat:["$orderAddressL",{$dateToString:{format:"--%Y年%m月%d",date:"$orderDate"}}]}}})
登入後複製

结果如下:

{
    "_id" : ObjectId("59f841f5b998d8acc7d08861"),
    "addr" : "NanJing--2017年10月31"
}
登入後複製

再比如我将orderAddressL全部转为小写返回:

db.sang_collect.aggregate({$project:{addr:{$toLower:"$orderAddressL"}}})
登入後複製

再比如我将orderAddressL全部转为大写返回:

db.sang_collect.aggregate({$project:{addr:{$toUpper:"$orderAddressL"}}})
登入後複製

逻辑表达式

想要比较两个数字的大小,可以使用$cmp操作符,如下:

db.sang_collect.aggregate({$project:{test:{$cmp:["$freight","$discounts"]}}})
登入後複製

如果第一个参数大于第二个参数返回正数,第一个参数小于第二个则返回负数,也可以利用$strcasecmp来比较字符串(中文无效):

db.sang_collect.aggregate({$project:{test:{$strcasecmp:[{$dateToString:{format:"..%Y年%m月%d",date:"$orderDate"}},"$orderAddressL"]}}})
登入後複製

至于我们之前介绍的$eq/$ne/$gt/$gte/$lt/$lte等操作符在这里一样是适用的。另外还有$and、$or、$not等表达式可用,以$and为例,如下:

db.sang_collect.aggregate({$project:{test:{$and:[{"$eq":["$freight","$prodMoney"]},{"$eq":["$freight","$discounts"]}]}}})
登入後複製

$and中的每个参数都为true时返回true,$or则表示参数中有一个为true就返回true,$not则会对它的参数的值取反,如下:

db.sang_collect.aggregate({$project:{test:{$not:{"$eq":["$freight","$prodMoney"]}}}})
登入後複製

另外还有两个流程控制语句,如下:

db.sang_collect.aggregate({$project:{test:{$cond:[false,"trueExpr","falseExpr"]}}})
登入後複製

$cond第一个参数如果为true,则返回trueExpr,否则返回falseExpr.

db.sang_collect.aggregate({$project:{test:{$ifNull:[null,"replacementExpr"]}}})
登入後複製

$ifNull第一个参数如果为null,则返回replacementExpr,否则就返回第一个参数。

以上内容就是MongoDB管道操作符部分介绍,希望能帮助到大家。

MongoDB固定集合详解

node.js操作MongoDB的代码案例分享

phpstudy如何扩展MongoDB

字元 意思 取值範圍
%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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!