溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MongoDB中如何操作管道操

發(fā)布時間:2021-07-27 16:00:04 來源:億速云 閱讀:177 作者:Leah 欄目:大數(shù)據(jù)

MongoDB中如何操作管道操,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

$match

match中都可以使用,比如獲取集合中所有author為”杜甫”的文檔,如下:

db.sang_collect.aggregate({$match:{author:"杜甫"}})

我們在實際使用時最好將match還可以用索引。

$project

基本用法

$project可以用來提取想要的字段,如下:

db.sang_collect.aggregate({$project:{title:1,_id:0}})

1表示要該字段,0表示不要該字段,也可以對返回的字段進行重命名,比如將title改為articleTitle,如下:

db.sang_collect.aggregate({$project:{"articleTitle":"$title"}})

不過這里有一個問題需要注意,如果原字段上有索引,重命名之后的字段上就沒有索引了,因此最好在重命名之前使用索引。

數(shù)學(xué)表達式

數(shù)學(xué)表達式可以用來對一組數(shù)值進行加減乘除取模,比如我的數(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" : [ 
        "可樂", 
        "奶茶"
    ]
}

訂單的總費用為商品費用加上運費,查詢?nèi)缦拢?/p>

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"]}}})

再比如求freight的商,如下:

db.sang_collect.aggregate({$project:{test1:{$divide:["$prodMoney","$freight"]}}})

再比如用prodMoney取模,如下:

db.sang_collect.aggregate({$project:{test1:{$mod:["$prodMoney","$freight"]}}})

加法和乘法都可以接收多個參數(shù),其余的都接收兩個參數(shù)。

日期表達式

日期表達式可以從一個日期類型中提取出年、月、日、星期、時、分、秒等信息,如下:

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"}}}})

執(zhí)行結(jié)果如下:

{
    "_id" : ObjectId("59f841f5b998d8acc7d08861"),
    "年份" : 2017,
    "月份" : 10,
    "一年中第幾周" : 44,
    "日期" : 31,
    "星期" : 3,
    "一年中第幾天" : 304,
    "時" : 9,
    "分" : 27,
    "秒" : 17,
    "毫秒" : 342,
    "自定義格式化時間" : "2017年10月31 09:27:17"
}

week表示本周是本年的第幾周,從0開始計。$dateToString是MongoDB3.0+中的功能。格式化的字符還有以下幾種:

MongoDB中如何操作管道操  

字符串表達式

字符串表達式中有字符串的截取、拼接、轉(zhuǎn)大寫、轉(zhuǎn)小寫等操作,比如我截取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"}}]}}})

結(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"}}})

邏輯表達式

想要比較兩個數(shù)字的大小,可以使用$cmp操作符,如下:

db.sang_collect.aggregate({$project:{test:{$cmp:["$freight","$discounts"]}}})

如果第一個參數(shù)大于第二個參數(shù)返回正數(shù),第一個參數(shù)小于第二個則返回負(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ù)中有一個為true就返回true,$not則會對它的參數(shù)的值取反,如下:

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

另外還有兩個流程控制語句,如下:

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

$cond第一個參數(shù)如果為true,則返回trueExpr,否則返回falseExpr.

db.sang_collect.aggregate({$project:{test:{$ifNull:[null,"replacementExpr"]}}})

$ifNull第一個參數(shù)如果為null,則返回replacementExpr,否則就返回第一個參數(shù)。

關(guān)于MongoDB中如何操作管道操問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI