您好,登錄后才能下訂單哦!
MongoDB中如何操作管道操,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
$match
match中都可以使用,比如獲取集合中所有author為”杜甫”的文檔,如下:
db.sang_collect.aggregate({$match:{author:"杜甫"}})
我們在實際使用時最好將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"]}}})
再比如求freight的商,如下:
db.sang_collect.aggregate({$project:{test1:{$divide:["$prodMoney","$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" }
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"]}}})
至于我們之前介紹的ne/gte/lte等操作符在這里一樣是適用的。另外還有or、and為例,如下:
db.sang_collect.aggregate({$project:{test:{$and:[{"$eq":["$freight","$prodMoney"]},{"$eq":["$freight","$discounts"]}]}}})
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中如何操作管道操問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。