摘要:用法取反操作符,返回表達式中取反后的布爾值。用法示例假設有一個關于考試成績的集合操作如下返回結果數學操作符操作符簡述求絕對值操作符,于版新加入。用法進一法取整操作符,取于版新加入。用法切割操作符,用于對字符串進行分切。
回顧 相關文章回顧
mongoDB查詢進階--聚合管道(一)回顧
mongoDB查詢進階--聚合管道(二)回顧
管道操作符可以分為三類:
階段操作符(Stage Operators)
表達式操作符(Expression Operators)--主要用于$project
累加器(Accumulators)--主要用于$group分組
參考MongoDB官網:https://docs.mongodb.com/manual/reference/operator/aggregation
表達式操作符(Expression Operators)本篇主要內容是管道操作符中的表達式操作符。
表達式操作符主要用于在管道中構建表達式時使用,使用類似于函數那樣需要參數,主要用于$project操作符中,用于構建表達式,使用方法一般如下:
方法1:
{: [ , ... ] }
方法2:
{表達式操作符分類: }
布爾值操作符(Boolean Operators)
集合操作符(Set Operators)
比較操作符(Comparison Operators)
數學操作符(Arithmetic Operators)
字符串操作符(String Operators)
文本搜索操作符(Text Search Operators)
數組操作符(Array Operators)
變量操作符(Variable Operators)
字面量操作符(Literal Operators)
日期操作符(Date Operators)
條件操作符(Conditional Operators)
數據類型操作符(Data Type Operators)
常用表達式操作符布爾值操作符(Boolean Operators)
操作符 | 簡述 |
---|---|
$and | 邏輯與操作符,當他的表達式中所有值都是true的時候,才返回true。 用法:{ $and: [ |
$or | 邏輯或操作符,當他的表達式中有值是true的時候,就會返回true。用法:{ $or: [ |
$not | 取反操作符,返回表達式中取反后的布爾值。用法:{ $not: [ |
例子 | 結果 |
---|---|
{ $and: [ 1, "green" ] } | true |
{ $and: [ ] } | true |
{ $and: [ [ null ], [ false ], [ 0 ] ] } | true |
{ $and: [ null, true ] } | false |
{ $and: [ 0, true ] } | false |
{ $or: [ true, false ] } | true |
{ $or: [ [ false ], false ] } | true |
{ $or: [ null, 0, undefined ] } | false |
{ $or: [ ] } | false |
{ $not: [ true ] } | false |
{ $not: [ [ false ] ] } | false |
{ $not: [ false ] } | true |
{ $not: [ null ] } | true |
{ $not: [ 0 ] } | true |
比較操作符(Comparison Operators)
操作符 | 簡述 |
---|---|
$cmp | 比較操作符,比較表達式中兩個值的大小,如果第一個值小于第二個值則返回-1,相等返回0,大于返回1。用法{ $cmp: [ |
$eq | 比較表達式中兩個是否相等,是則返回true,否則返回false。用法{ $eq: [ |
$gt | 比較表達式中第一個值是否大于第二個值,是則返回true,否則返回false。用法{ $gt: [ |
$gte | 比較表達式中第一個值是否大于等于第二個值,是則返回true,否則返回false。用法{ $gte: [ |
$lt | 比較表達式中第一個值是否小于第二個值,是則返回true,否則返回false。用法{ $lt: [ |
$lte | 比較表達式中第一個值是否小于等于第二個值,是則返回true,否則返回false。用法{ $lte: [ |
$ne | 比較表達式中兩個是否相等,不過返回值與$eq相反,是則返回false,否則返回true。用法{ $ne: [ |
假設有一個關于考試成績的集合:
{ "_id" : 1, "name" : "abc1", score: 80 } { "_id" : 2, "name" : "avc1", score: 82 } { "_id" : 3, "name" : "adc1", score: 79 } { "_id" : 4, "name" : "awc1", score: 60 } { "_id" : 5, "name" : "xyz1", score: 50 } { "_id" : 6, "name" : "VWZ1", score: 100 }
操作如下:
db.collection.aggregate( [ { $project: { name: 1, score: 1, cmp60: { $cmp: [ "$score", 60 ] }, eq100: { $eq: [ "$score", 100 ] }, gt80: { $gt: [ "$score", 80 ] }, gte80: { $gte: [ "$score", 80 ] }, lt80: { $lt: [ "$score", 80 ] }, lte80: { $lte: [ "$score", 80 ] }, ne100: { $ne: [ "$score", 100 ] }, _id: 0 } } ] )
返回結果:
{ "name" : "abc1", score: 80, cmp60: 1, eq100: false, gt80: false, gte80: true, lt80: false, lte80: true, ne100: true } { "name" : "avc1", score: 82, cmp60: 1, eq100: false, gt80: true, gte80: true, lt80: false, lte80: false, ne100: true } { "name" : "adc1", score: 79, cmp60: 1, eq100: false, gt80: false, gte80: false, lt80: true, lte80: false, ne100: true } { "name" : "awc1", score: 60, cmp60: 0, eq100: false, gt80: false, gte80: false, lt80: true, lte80: true, ne100: true } { "name" : "xyz1", score: 50, cmp60: -1, eq100: false, gt80: false, gte80: false, lt80: true, lte80: true, ne100: true } { "name" : "VWZ1", score: 100, cmp60: 1, eq100: true, gt80: true, gte80: true, lt80: false, lte80: false, ne100: false }
數學操作符(Arithmetic Operators)
操作符 | 簡述 |
---|---|
$abs | 求絕對值操作符,于v3.2版新加入。用法:{ $abs: |
$add | 求和操作符,返回所有表達式相加起來的結果。用法:{ $add: [ |
$ceil | 進一法取整操作符,取 于v3.2版新加入。用法:{ $ceil: |
$divide | 求商操作符,返回表達式1除以表達式2的商。用法:{ $divide: [ |
$subtract | 求差操作符,返回表達式1減去表達式2的結果。用法:{ $subtract: [ |
$multiply | 求積操作符,返回所有表達式相乘的結果。用法:{ $multiply: [ |
$mod | 求余操作符,返回所有表達式1除以表達式2所得到的余數。用法:{ $multiply: [ |
例子 | 結果 |
---|---|
{ $abs: -1 } | 1 |
{ $abs: 1 } | 1 |
{ $abs: null } | null |
{ $add: [1, 1] } | 2 |
{ $ceil: 1 } | 1 |
{ $ceil: 7.80 } | 8 |
{ $ceil: -2.8 } | -2 |
{ $divide: [40, 8] } | 5 |
{ $subtract: [10, 8] } | 2 |
{ $multiply: [5, 8] } | 40 |
{ $mob: [80, 7] } | 3 |
{ $mob: [80, 8] } | 0 |
Tips: $add將一個日期類型和數字類型相加會變成日期類型。 這樣的話,當數據庫存儲的是時間戳但是需要又想對其使用日期操作符的話,就可以通過這樣的方法,先讓其變成日期類型,然后再使用日期操作符,用法參考:{ $add: [ new Date(0), "$ts" ] }。
字符串操作符(String Operators)
操作符 | 簡述 |
---|---|
$concat | 連接操作符,將給定表達式中的字符串連接一起。用法:{ $concat: [ |
$split | 切割操作符,用于對字符串進行分切。用法:{ $split: [ |
$toLower | 用于返回字符串的小寫形式。用法:{ $toLower: |
$toUpper | 用于返回字符串的大寫形式。用法:{ $toUpper: |
$substr | 用于返回子字符串,v3.4+版本不建議使用,應該使用substrBytes或substrCP,v3.4+版本使用的話,相當于substrBytes。用法:{ $substr: [ |
$substrBytes | 用于根據UTF-8下的字節位置返回子字符串(起始位置為0),于v3.4新增。用法:{ $substrBytes: [ |
$substrCP | 用于根據UTF-8下的Code Point位置返回子字符串(起始位置為0),于v3.4新增。用法:{ $substrCP: [ , |
Code Point: (1) Any value in the Unicode codespace; that is, the range of integers from 0 to 10FFFF16. Not all code points are assigned to encoded characters. See code point type. (2) A value, or position, for a character, in any coded character set.
例子 | 結果 |
---|---|
{ $concat: [ "item", " - ", "a" ] } | item - a |
{ $split: [ "June-15-2013", "-" ] } | [ "June", "15", "2013" ] |
{ $split: [ "banana split", "a" ] } | [ "b", "n", "n", " split" ] |
{ $split: [ "headphone jack", 7 ] } | $split第二個參數必須是一個字符串,不能是數字 |
{ $toLower: "ITEM" } | "item" |
{ $toLower: "Item" } | "item" |
{ $toLower: null } | "" |
{ $toUpper: "item" } | "ITEM" |
{ $toUpper: "Item" } | "ITEM" |
{ $toUpper: null } | "" |
{ $substrBytes: [ "abcde", 1, 2 ] } | "bc" |
{ $substrBytes: [ "Hello World!", 6, 5 ] } | "World" |
{ $substrBytes: [ "cafétéria", 0, 5 ] } | "café" |
{ $substrBytes: [ "cafétéria", 5, 4 ] } | "tér" |
{ $substrBytes: [ "cafétéria", 7, 3 ] } | "Error: Invalid range, starting index is a UTF-8 continuation byte." |
{ $substrBytes: [ "cafétéria", 3, 1 ] } | "Error: Invalid range, ending index is in the middle of a UTF-8 character." |
{ $substrBytes: [ "壽司sushi", 0, 3 ] } | "壽" |
{ $substrCP: [ "abcde", 1, 2 ] } | "bc" |
{ $substrCP: [ "Hello World!", 6, 5 ] } | "World" |
{ $substrCP: [ "cafétéria", 0, 5 ] } | "cafét" |
{ $substrCP: [ "cafétéria", 5, 4 ] } | "tér" |
{ $substrCP: [ "cafétéria", 7, 3 ] } | "ia" |
{ $substrCP: [ "cafétéria", 3, 1 ] } | "é" |
{ $substrCP: [ "壽司sushi", 0, 3 ] } | "壽司s" |
日期操作符(Date Operators)
操作符 | 簡述 |
---|---|
$dayOfYear | 返回一年中的一天,值在1和366(閏年)之間。用法:{ $dayOfYear: |
$dayOfMonth | 返回一個月中的一天,值在1和31之間。用法:{ $dayOfMonth: |
$dayOfWeek | 返回一周中的一天,值在1(周日)和7(周六)之間。用法:{ $dayOfWeek: |
$year | 返回年份,eg:2017。用法:{ $year: |
$month | 返回月份,值在1和12之間。用法:{ $month: |
$week | 返回周 ,值在0和53之間。用法:{ $week: |
$hour | 返回時 ,值在0和23之間。用法:{ $hour: |
$minute | 返回分 ,值在0和59之間。用法:{ $minute: |
$second | 返回秒,值在0和60之間(閏秒)。用法:{ $second: |
$millisecond | 返回毫秒,值在0和999之間。用法:{ $millisecond: |
$dateToString | 返回日期的字符串。用法:{ $dateToString: { format: |
假如有以下數據:
{ "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-01-01T08:15:39.736Z") }
進行如下操作:
db.collection.aggregate( [ { $project: { year: { $year: "$date" }, month: { $month: "$date" }, day: { $dayOfMonth: "$date" }, hour: { $hour: "$date" }, minutes: { $minute: "$date" }, seconds: { $second: "$date" }, milliseconds: { $millisecond: "$date" }, dayOfYear: { $dayOfYear: "$date" }, dayOfWeek: { $dayOfWeek: "$date" }, week: { $week: "$date" }, yearMonthDayUTC: { $dateToString: { format: "%Y-%m-%d", date: "$date" } }, time: { $dateToString: { format: "%H:%M:%S:%L", date: "$date" } } } } ] )
返回結果:
{ "_id" : 1, "year" : 2014, "month" : 1, "day" : 1, "hour" : 8, "minutes" : 15, "seconds" : 39, "milliseconds" : 736, "dayOfYear" : 1, "dayOfWeek" : 4, "week" : 0, "yearMonthDayUTC" : "2014-01-01", "time" : "08:15:39:736" }
條件操作符(Conditional Operators)
操作符 | 簡述 |
---|---|
$cond | 用法:{ $cond: [ |
$ifNull | 用法:{ $ifNull: [ |
假設有一個關于考試成績的集合:
{ "_id" : 1, "name" : "a", score: 80 } { "_id" : 2, "name" : "b", score: 69 } { "_id" : 3, "name" : "c", score: 53 } { "_id" : 3, "name" : null, score: 70 }
操作如下:
db.collection.aggregate( [ { $project: { _id: 0, score: 1, pass: { $cond: [ { $gte: [ "$score", 60 ] }, 1, 0 ] }, description: { $ifNull: [ "$name", "Unspecified" ] } } } ] )
返回結果:
{ "name" : "a", score: 80, pass: 1 } { "name" : "b", score: 69, pass: 1 } { "name" : "c", score: 53, pass: 0 } { "name" : "Unspecified", score: 70, pass: 1 }總結
本文介紹表達式操作符的分類和常用的表達式操作符的用法,表達式操作符主要作用于$project下,通過使用這些操作符可以對文檔中的字面量進行處理并返回,進而返回更多有用的數據。
感謝閱讀~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85025.html
摘要:累加器累加器本來只能使用與下,但是版本或以上,部分累加器還能使用于。當在中使用時,累加器是針對每個分組使用的當在中使用時,累加器則是針對每個字面量起作用。 回顧 相關文章回顧 mongoDB查詢進階--聚合管道(一)回顧mongoDB查詢進階--聚合管道(二)回顧mongoDB查詢進階--聚合管道(三)回顧 管道操作符的分類 管道操作符可以分為三類: 階段操作符(Stage Oper...
摘要:累加器累加器本來只能使用與下,但是版本或以上,部分累加器還能使用于。當在中使用時,累加器是針對每個分組使用的當在中使用時,累加器則是針對每個字面量起作用。 回顧 相關文章回顧 mongoDB查詢進階--聚合管道(一)回顧mongoDB查詢進階--聚合管道(二)回顧mongoDB查詢進階--聚合管道(三)回顧 管道操作符的分類 管道操作符可以分為三類: 階段操作符(Stage Oper...
摘要:用法取反操作符,返回表達式中取反后的布爾值。用法示例假設有一個關于考試成績的集合操作如下返回結果數學操作符操作符簡述求絕對值操作符,于版新加入。用法進一法取整操作符,取于版新加入。用法切割操作符,用于對字符串進行分切。 回顧 相關文章回顧 mongoDB查詢進階--聚合管道(一)回顧mongoDB查詢進階--聚合管道(二)回顧 管道操作符的分類 管道操作符可以分為三類: 階段操作符(...
摘要:當在中使用時,累加器是針對每個分組使用的當在中使用時,累加器則是針對每個字面量起作用,具體用法下一篇文章闡述。另外再加以配合表達式操作符組成的表達式或者在或中使用累加器能查詢統計的內容會更加的多樣化。 上篇最后說到管道操作符,本篇文章將詳細說一下管道操作符。 mongoDB查詢進階--聚合管道(一)回顧 什么是管道操作符(Aggregation Pipeline Operators) ...
摘要:當在中使用時,累加器是針對每個分組使用的當在中使用時,累加器則是針對每個字面量起作用,具體用法下一篇文章闡述。另外再加以配合表達式操作符組成的表達式或者在或中使用累加器能查詢統計的內容會更加的多樣化。 上篇最后說到管道操作符,本篇文章將詳細說一下管道操作符。 mongoDB查詢進階--聚合管道(一)回顧 什么是管道操作符(Aggregation Pipeline Operators) ...
閱讀 1048·2021-11-22 15:33
閱讀 3357·2021-11-08 13:20
閱讀 1368·2021-09-22 10:55
閱讀 2053·2019-08-29 11:08
閱讀 771·2019-08-26 12:24
閱讀 3068·2019-08-23 17:15
閱讀 2225·2019-08-23 16:12
閱讀 1933·2019-08-23 16:09