MongoDB中如何操作管道操,針對這個(gè)問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),網(wǎng)站模板,微信公眾號開發(fā),軟件開發(fā),微信平臺(tái)小程序開發(fā),十載建站對成都宴會(huì)酒店設(shè)計(jì)等多個(gè)領(lǐng)域,擁有豐富建站經(jīng)驗(yàn)。
$match
match中都可以使用,比如獲取集合中所有author為”杜甫”的文檔,如下:
db.sang_collect.aggregate({$match:{author:"杜甫"}})
我們在實(shí)際使用時(shí)最好將match還可以用索引。
$project可以用來提取想要的字段,如下:
db.sang_collect.aggregate({$project:{title:1,_id:0}})
1表示要該字段,0表示不要該字段,也可以對返回的字段進(jìn)行重命名,比如將title改為articleTitle,如下:
db.sang_collect.aggregate({$project:{"articleTitle":"$title"}})
不過這里有一個(gè)問題需要注意,如果原字段上有索引,重命名之后的字段上就沒有索引了,因此最好在重命名之前使用索引。
數(shù)學(xué)表達(dá)式可以用來對一組數(shù)值進(jìn)行加減乘除取模,比如我的數(shù)據(jù)結(jié)構(gòu)如下:
{ "_id" : ObjectId("59f841f5b998d8acc7d08863"), "orderAddressL" : "ShenZhen", "prodMoney" : 45.0, "freight" : 13.0, "discounts" : 3.0, "orderDate" : ISODate("2017-10-31T09:27:17.342Z"), "prods" : [ "可樂", "奶茶" ] }
訂單的總費(fèi)用為商品費(fèi)用加上運(yùn)費(fèi),查詢?nèi)缦拢?/p>
db.sang_collect.aggregate({$project:{totalMoney:{$add:["$prodMoney","$freight"]}}})
實(shí)際付款的費(fèi)用是總費(fèi)用減去折扣,如下:
db.sang_collect.aggregate({$project:{totalPay:{$subtract:[{$add:["$prodMoney","$freight"]},"$discounts"]}}})
再來三個(gè)無厘頭運(yùn)算,比如計(jì)算prodMoney和freight和discounts的乘積:
db.sang_collect.aggregate({$project:{test1:{$multiply:["$prodMoney","$freight","$discounts"]}}})
再比如求freight的商,如下:
db.sang_collect.aggregate({$project:{test1:{$divide:["$prodMoney","$freight"]}}})
再比如用prodMoney取模,如下:
db.sang_collect.aggregate({$project:{test1:{$mod:["$prodMoney","$freight"]}}})
加法和乘法都可以接收多個(gè)參數(shù),其余的都接收兩個(gè)參數(shù)。
日期表達(dá)式可以從一個(gè)日期類型中提取出年、月、日、星期、時(shí)、分、秒等信息,如下:
db.sang_collect.aggregate({$project:{"年份":{$year:"$orderDate"},"月份":{$month:"$orderDate"},"一年中第幾周":{$week:"$orderDate"},"日期":{$dayOfMonth:"$orderDate"},"星期":{$dayOfWeek:"$orderDate"},"一年中第幾天":{$dayOfYear:"$orderDate"},"時(shí)":{$hour:"$orderDate"},"分":{$minute:"$orderDate"},"秒":{$second:"$orderDate"},"毫秒":{$millisecond:"$orderDate"},"自定義格式化時(shí)間":{$dateToString:{format:"%Y年%m月%d %H:%M:%S",date:"$orderDate"}}}})
執(zhí)行結(jié)果如下:
{ "_id" : ObjectId("59f841f5b998d8acc7d08861"), "年份" : 2017, "月份" : 10, "一年中第幾周" : 44, "日期" : 31, "星期" : 3, "一年中第幾天" : 304, "時(shí)" : 9, "分" : 27, "秒" : 17, "毫秒" : 342, "自定義格式化時(shí)間" : "2017年10月31 09:27:17" }
week表示本周是本年的第幾周,從0開始計(jì)。$dateToString是MongoDB3.0+中的功能。格式化的字符還有以下幾種:
字符串表達(dá)式中有字符串的截取、拼接、轉(zhuǎn)大寫、轉(zhuǎn)小寫等操作,比如我截取orderAddressL前兩個(gè)字符返回,如下:
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"}}]}}})
結(jié)果如下:
{ "_id" : ObjectId("59f841f5b998d8acc7d08861"), "addr" : "NanJing--2017年10月31" }
再比如我將orderAddressL全部轉(zhuǎn)為小寫返回:
db.sang_collect.aggregate({$project:{addr:{$toLower:"$orderAddressL"}}})
再比如我將orderAddressL全部轉(zhuǎn)為大寫返回:
db.sang_collect.aggregate({$project:{addr:{$toUpper:"$orderAddressL"}}})
想要比較兩個(gè)數(shù)字的大小,可以使用$cmp操作符,如下:
db.sang_collect.aggregate({$project:{test:{$cmp:["$freight","$discounts"]}}})
如果第一個(gè)參數(shù)大于第二個(gè)參數(shù)返回正數(shù),第一個(gè)參數(shù)小于第二個(gè)則返回負(fù)數(shù),也可以利用$strcasecmp來比較字符串(中文無效):
db.sang_collect.aggregate({$project:{test:{$strcasecmp:[{$dateToString:{format:"..%Y年%m月%d",date:"$orderDate"}},"$orderAddressL"]}}})
至于我們之前介紹的ne/gte/lte等操作符在這里一樣是適用的。另外還有or、and為例,如下:
db.sang_collect.aggregate({$project:{test:{$and:[{"$eq":["$freight","$prodMoney"]},{"$eq":["$freight","$discounts"]}]}}})
or則表示參數(shù)中有一個(gè)為true就返回true,$not則會(huì)對它的參數(shù)的值取反,如下:
db.sang_collect.aggregate({$project:{test:{$not:{"$eq":["$freight","$prodMoney"]}}}})
另外還有兩個(gè)流程控制語句,如下:
db.sang_collect.aggregate({$project:{test:{$cond:[false,"trueExpr","falseExpr"]}}})
$cond第一個(gè)參數(shù)如果為true,則返回trueExpr,否則返回falseExpr.
db.sang_collect.aggregate({$project:{test:{$ifNull:[null,"replacementExpr"]}}})
$ifNull第一個(gè)參數(shù)如果為null,則返回replacementExpr,否則就返回第一個(gè)參數(shù)。
關(guān)于MongoDB中如何操作管道操問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。