1. 程式人生 > >MongoDB學習筆記(八)——操作彙總運算子、修飾符、聚合管道

MongoDB學習筆記(八)——操作彙總運算子、修飾符、聚合管道

上一篇我列舉了MongoDB shell的所有的方法,該篇我將列舉MongoDB的更新、查詢等的所有操作符、管道聚合操作、管道聚合階段、查詢修飾語等。用作以後大家在使用MongoDB或學習MongoDB時可以使用該篇博文做個集中查閱的文章。

查詢和對映操作(Query and Projection Operators)

原文連結
網上找到一個比較詳細的與sql操作對比的文件。連結

查詢選擇器

比較查詢運算子

名稱 描述 格式
$eq 匹配指定的兩個值是否相等, {field: {$eq: value} }
$gt 匹配欄位值比指定值大的文件 {field: {$gt: value} }
$gte 匹配欄位值比指定值大與等於的文件 {field: {$gte: value} }
$in 欄位值匹配到陣列中指定的任何值的文件 { field: { $in: [value1, value2, … valueN ] } }
$lt 匹配欄位值小於指定值的文件。 {field: {$lt: value} }
$lte 匹配欄位值小於或等於指定值的文件。 {field: { $lte: value} }
$ne 匹配欄位值不等於指定值或不包該欄位的文件。 {field: {$
ne: value} }
$nin 匹配欄位值不在指定陣列中或不包該欄位的文件 {field: {$nin: value} }

邏輯查詢運算子

名稱 描述 格式
$and 返回與兩個查詢子句都匹配的文件 { $and:[{expression1}, {expression2}, … ,{expressionN} ] }
$not 返回與查詢表示式不匹配的文件 { field: { $not: { operator-expression} } }
$nor 返回兩個查詢子句都不匹配的文件 { $nor: [{expression1}, {expression2}, … {expressionN} ] }
$or 返回與任意一個查詢子句匹配的文件 { $or: [{expression1}, {expression2}, … {expressionN} ] }

元素查詢運算子

名稱 描述 格式
$exists 匹配具有指定欄位的文件 { field: { $exists: boolean} }
$type 匹配指定欄位為指定BSON型別的文件 { field: { $type: BSON type } }

評估查詢運算子

名稱 描述 格式
$expr 允許在查詢語言中使用聚合表示式。 { $expr: { expression} }
$jsonSchema 匹配符合與給定的json綱要的文件。 {$jsonSchema: schema}
$mod 對執行執行求模運算,並返回結果為指定值的文件,求模運算條件時使用陣列指定的,其中第一個數字為除數,第二個數字時餘數。 { field: { $mod: [ divisor, remainder ] } }
$regex 返回指定欄位值與正則表示式匹配的文件 { field: /pattern/options }
$text 文字對帶有文字索引的欄位內容執行文字搜尋 {$text:{ $search:string, $language: string, $caseSensitive: boolean, $diacriticSensitive: boolean }}
$where 匹配滿足javascript表示式的文件。 { $where: function() { return …;} }

地理空間查詢運算子(該篇建議大家檢視源文件說明,翻譯的感覺有誤差)

名稱 描述
$geoIntersect 選擇與GeoJSON幾何相交的幾何圖形。2dsphere索引支援$geoIntersects。
$geoWithin 選擇具有完全位於指定形狀內的地理空間資料的文件
$near 指定一個能將文件從最近到最遠形式返回的地理空間查詢的點。該運算子可以指定一個GeoJSON點或遺留座標點。
$nearSphere 指定一個能將文件從最近到最遠形式返回的地理空間查詢的點。mongodb使用球面幾何計算出$nearSphere的距離。
$box 使用遺留座標對指定一個矩形框,用於$geoWithin查詢。2d索引支援$box。
$center $geoWithin使用平面幾何查詢時,使用遺留座標指定一個圓。 2d索引支援$center。
$centerSphere 當使用球面幾何時,使用遺留座標對或者使用GeoJson格式的$geoWithin查詢指定一個圓。2dsphere和2d索引支援$center。
$geometry 指定一個基於GeoJSON格式的地理空間查詢操作的幾合。
$maxDistance 指定一個最大的距離來限制$near和$nearSphere的查詢結果,2dsphere和2d索引支援$maxDistance。
$minDistance 指定一個最大的距離來限制$near和$nearSphere的查詢結果,僅限2dsphere索引支援
$polygon $geoWithin查詢使用遺留座標對指定一個多邊形。2d索引支援$polygon。
$uniqueDocs 不建議使用,改變一個$geoWithin和$near查詢來確保即使一個文件匹配多次,也只返回一次。

陣列查詢運算子

名稱 描述 格式
$all 匹配文件的一個欄位值是包含所有指定元素的陣列的文件 {field: { $all: [ value1, value2…] } }
$elemMatch 該運算子匹配包含至少有一個與所有指定的查詢條件匹配的元素的陣列欄位的文件 {field: { $elemMatch: { query1, query2, … } } }
$size 匹配指定陣列欄位為指定大小的文件 { field: { $size: size } }

按位查詢運算子

名稱 描述 格式
$bitsAllClear 匹配所有給定的bit位都是0 { field: { $bitsAllClear: numeric bitmask | BinData bitmask | [ position1, position2, … ] } }
$bitsAllSet 匹配所有給定的bit位都是1 { field: { $bitsAllSet: numeric bitmask | BinData bitmask | [ position1, position2, … ] } }
$bitsAnyClear 匹配給定的bit位任一位是0 { field: { $bitsAnyClear: numeric bitmask | BinData bitmask | [ position1, position2, … ] } }
$bitsAnySet 匹配給定的bit位任一位是1 { field: { $bitsAnySet: numeric bitmask | BinData bitmask | [ position1, position2, … ] } }

上面的可以參考下面的例子:
給定資料:

db.collection.save({ _id: 1, a: 54, binaryValueofA: "00110110" })
db.collection.save({ _id: 2, a: 20, binaryValueofA: "00010100" })
db.collection.save({ _id: 3, a: 20.0, binaryValueofA: "00010100" })
db.collection.save({ _id: 4, a: BinData(0, "Zg=="), binaryValueofA: "01100110" })

給定查詢:

db.collection.find( { a: { $bitsAllClear: [ 1, 5 ] } } )

返回結果:

{ "_id" : 2, "a" : 20, "binaryValueofA" : "00010100" }
{ "_id" : 3, "a" : 20, "binaryValueofA" : "00010100" }

註解運算子

名稱 描述 格式
$comment 向查詢語句添加註釋。 { query, $comment: comment>}

對映運算子

名稱 描述 格式
$(projection) $運算子限制查詢出的結果陣列的內容,限制其只包含匹配查詢文件的第一個元素。 {find({ array: value, someOtherArray: value2 }, { “array.$”: 1 } )
$elemMatch 該操作符限制查詢結果的一個數組欄位只包含匹配$elemMatch條件的第一個元素。 { students: { $elemMatch: { school: 102, age: { $gt: 10} } } }
$meta $meta對映運算子返回與查詢關聯的元資料(例如“textScore”)的每個匹配文件。 { $meta:metaDataKeyword }
$slice (projection) $slice運算子控制查詢返回的陣列項的項數。 find( { field: value }, { array: {$slice: count } } )

修改操作(Query and Projection Operators)

原文連結

欄位更新運算子

名稱 描述 格式
$currentDate 將欄位的值設定為當前日期,無論是日期還是時間戳。 { $currentDate: { field1: typeSpecification1, … } }
$inc 將欄位值增加指定的值 { $inc: { field1: amount1, field2: amount2, … } }
$min 只更新指定值小於現有欄位值的欄位。 { $min: { field1: value1, … } }
$max 只更新指定值小於現有欄位值的欄位. { $max: { field1: value1, … } }
$mul 將欄位的值乘以指定的數量。 { $mul: { field1: number1, … } }
$rename 重新命名欄位。 {$rename: { field1: newName1,field2: newName2,…}}
$set 設定既有文件的欄位值 {$set: { field1: value1, … } }
$setOnInsert 在新建文件時設定欄位的值 update(query,{$setOnInsert: { field1: value1, … } },{ upsert: true })
$unset 從既有文件中刪除指定欄位 {$unset: {field1: “”, … } }

陣列更新運算子

名稱 描述 格式
$ 充當佔位符,更新與查詢條件匹配的第一個元素 { “.$” : value }
$[] 充當佔位符,更新中匹配查詢條件的文件陣列的所有元素。 {update operator: { “array.$[]” : value } }
$[identifier] 充當佔位符,更新與查詢條件匹配的文件的陣列欄位值,修改陣列中符合陣列過濾條件的的陣列元素 {update operator: { “array.$[identifier]” : value } },{ arrayFilters: [ { identifier: condition>} } ] }
$addToSet 在既有陣列中新增元素 {$addToSet: { field1: value1, … } }
$pop 刪除陣列的第一個或最後一個元素,-1-第一個,1-最後一個 { $pop: { field: <-1
$pull 從陣列中刪除與查詢條件匹配的元素,其中查詢條件是一個基本的查詢物件,指定了欄位名和匹配條件 { $pull:{field1: value|condition, … } }
$push 在資料中新增一個元素 { $push: { field1: value1, … } }
$pullAll 從陣列中刪除多個值,要刪除的值是以陣列方式指定的 {$pullAll:{field1:[value1,value2 … ],…}}
$each 用於運算子$push和$addToSet的限定符,用於在陣列中新增多個元素 {$addToSet: {field: {$each: [ value1, value2 … ] } } }
$position 用於運算子$push的限定符,用於修改指定陣列中新增元素的位置。 {$push:{field:{$each:[value1,value2, … ],$position: num }}}
$slice 用於運算子$push的限定符,用於限制更新後的陣列長度 {$push:{field:{$each:[value1,value2, … ],$slice: num }}}
$sort 用於運算子$push的限定符,用於將陣列中的文件重新排序 {$push:{field:{$each:[value1,value2, … ],$sort: }}}
$bit 對整數值執行按位與和或運算 {$bit: {field: { and|or|xor: int } } }

聚合管道階段

原文連結

名稱 描述
$addFields 向文件新增新欄位。
$bucket 根據指定表示式和塊邊界將傳入文件分到塊中。
$bucketAuto 根據指定表示式將傳入文件歸類為指定數量的塊。在試圖將文件分配到指定數量的塊中時,自動確定塊的邊界。
$collStats 返回有關集合或檢視的統計資訊。
$count 返回聚合管道的當前階段文件數的計數。
$currentOp 返回用於mongodb部署的活動和/或休眠操作的資訊。
$facet 在同一輸入文件集合中處理單個階段內的多個聚合管道。
$geoNear 基於接近地理空間點的文件返回有序的文件流
$graphLookup 在集合上執行遞迴搜尋。對於每個輸出文件,新增一個包含該文件的遞迴搜尋遍歷結果的新陣列欄位。
$group 將文件按照一些指定表示式進行分組,並且為每一個不同的分組輸出到下一階段的文件
$indexStats 返回集合中每個索引的關於使用的統計資訊。
$limit 限制傳遞到管道中的下一個階段的文件數量。
$listLocalSessions 列出由mongod或mongos例項快取記憶體中的會話。
$listSessions 列出儲存在配置資料庫中的 system.sessions集合中的所有會話。這些會話對於mongodb部署的所有成員都是可見的。
$lookup 在同一資料庫中執行一個unsharded集合的左外聯接,從“joined”集合中篩選文件以進行處理。對於每個輸入文件,$lookup添加了一個元素是的從“joined”集合匹配的文件的新陣列欄位。$lookup將這些經過修改的文件傳遞到下一個階段。
$match 篩選文件,只傳遞與指定條件匹配的文件到下一個管道階段。
$out 獲取聚合管道返回的文件並將它們寫入指定的集合。
$project 將文件與所請求欄位傳遞到管道的下一個階段。
$redact 根據文件本身儲存的資訊來限制文件內容。
$replaceRoot 將指定文件提升到最高等級,並替換所有其他欄位。該操作替換輸入文件中所有現有欄位,包括_id欄位。
$sample 隨機從輸入中選擇指定數目的文件。
$skip 跳過當前階段的指定數量的文件,並將剩餘文件傳遞到管道的下一個階段。
$sort 所有輸入文件進行排序,並按順序返回到管道中。
$sortByCount 根據指定表示式的值將傳入文件進行分組,然後計算每個不同組中文件的計數。
$unwind 從輸入文件中解構出一個數組欄位來為每個元素輸出一個文件。

聚合管道操作

原文連結

名稱 描述
$abs 返回一個數字的絕對值。
$add 將數字新增到一起或給日期新增數字(毫秒)。
$addToSet 根據欄位將文件分組,將每組的指定欄位的所有不同值集合成一個數組並輸出。輸出陣列中元素的順序無特定順序。僅可在$group中使用。
$allElementsTrue 將陣列作為集合進行計算,如果陣列中沒有元素為false,則返回true。否則返回false。空陣列返回true。
$and 只有當所有表示式都返回true時返回true。接受任意數量的引數表示式。
$anyElementTrue 將陣列作為集合進行計算,如果任何元素都是true和false,則返回true。空陣列返回false。
$arrayElemAt 返回指定陣列索引中的元素。
$arrayToObject 將key-value陣列轉換為文件。
$avg 返回數值型別值的平均值。忽略非數值值。版本3.2更改:既可用於 $group,也可用於$project。
$ceil 返回大於或等於指定數字的最小整數
$cmp 如果兩個值相等返回0,如果第一個值大於第二個值返回1,如果第一個值小於第二個值返回-1。
$concat 將任意數量的字串連線起來
$concatArrays 連線多個數組,返回一個連線之後的陣列
$cond 一個計算一個表示式的三元運算子,並且根據結果返回兩個表示式之中的一個。
$dateFromParts 根據給的日期組成部分構建一個BJSON日期
$dateToParts 返回包含日期組成部分的文件。
$dateFromString 返回日期/時間作為日期物件。
$dateToString 返回日期的格式化字串
$dayOfMonth 返回月份的日期,1-31之間的數字
$dayOfWeek 返回自然周的日期,1(Sunday)-7(Saturday)之間的數字
$dayOfYear 返回指定時間在一年的日期,1-366之間的數字
$divide 返回第二個數字除以第一個數字的結果。接受兩個引數表示式。
$eq 判斷兩個數是否相等
$exp 將尤拉數(即e)提高到指定的指數並返回結果。
$filter 使用與篩選條件匹配的陣列元素的子集以返回一個數組
$floor 返回每個組的第一個文件的值。 僅$group可用
$gt 判斷第一個值是否大於第二個值
$gte 判斷第一個值是否大於等於第二個值
$hour 返回一個日期的時間值,0-23之間的數字
$ifNull 根據第一個表示式的值返回結果,如果第一個表示式的值為null,則返回第二個表示式的值,如果第一個表示式的值不為null,則返回第一個表示式的值。第二個表示式的值可以為null
$in 返回一個布林值,該布林值指示指定值是否位於陣列中。
$indexOfArray 搜尋陣列以返回指定值第一個出現的陣列索引。如果未找到子字串,則返回-1。
$indexOfBytes 在字串中搜索子字串,並返回第一個出現的utf-8位元組。如果未找到子字串,則返回-1。
$indexOfCP 在字串中搜索子字串,並返回第一個出現的utf-8碼點。如果未找到子字串,則返回-1。
$isArray 返回物件是否為陣列
$isoDayOfWeek 返回工作周的ISO 8601格式的工作日數,值在1(Monday)-7(Sunday)
$isoWeek 返回iso 8601格式的週數,範圍為1至53。週數開始於1周(星期一至週日),其中包含一年的第一個星期四。
$isoWeekYear 返回iso 8601格式的年份號。該年度始於第1周(Iso 8601)的星期一,最後一週是下一年第一週的上週(Iso 8601)。
$last 將文件分組,並根據每組共有的一個欄位為標準,返回每組共有欄位值為最後一個的文件。只有在文件處於定義順序時才有意義。僅可在$group使用。
$let 繫結變數以用於指定表示式中,並返回表示式的結果。
$literal 返回一個沒有解析的值。用於聚合管道可能作為表示式解釋的值。
$ln 計算一個數字的自然日誌。
$log 根據指定基礎數字計算日誌的目並將結果作為double值返回。
$log10 以10為基礎數字計算日誌的數目,並將結果作為double值返回。
$lt 判斷第一個值是否小與第二個值
$lte 判斷第一個值是否小於等於第二個值
$map 將一個子表示式應用到陣列的每個元素中,然後將返回值排序並按照陣列返回。接受命名引數。
$max 將表示式運用到每個分組中,並返回每個分組的計算的最大值。$group和$project都可以使用
$mergeObjects 將多個文件合併成一個文件。
$meta 返回與管道操作中文件關聯的元資料,例如在執行文字搜尋時的“textScore”。
$min 將表示式運用到每個分組中,並返回每個分組的計算的最小值。$group和$project都可以使用
$millisecond 返回日期中的毫秒數,結果是介於0和999之間的數字。
$minute 返回日期的分鐘數,結果是介於0和59之間的數字。
$mod 返回第一個數字除以第二個數字的餘數。接受兩個引數表示式。
$month 返回日期的月數,結果是介於1(January)和12(December)之間的數字。
$multiply 將數字相乘並返回結果,引數是以陣列格式傳入
$ne 判斷兩個值是否不相等,不等返回true
$not 返回與其引數表示式相反的布林值。接受單個引數表示式。等同於 “!”
$objectToArray 將文件轉換為key-value文件陣列。
$or 當其任何表示式計算為true時返回true。
$pow 將一個數字新增到指定的指數並返回結果。
$push 將每個分組應用表示式,並將所有返回值作為陣列返回
$range 返回一個包含根據使用者定義輸入的整數序列的陣列
$reduce 返回一個由數字生成序列生成的數字陣列
$reverseArray 返回一個數組元素逆序生成的陣列
$second 返回日期為0至60之間的秒數(閏年)。
$setDifference 返回包含在第一個集合中但不在第二集合中的元素;只接受兩個引數表示式。
$setEquals 比較兩個或多個數組,判斷它們是否具有相同的元素
$setIntersection 返回所有輸入集合中出現的元素組成的一個集合
$setIsSubset 判斷第一個集合是否是第二個集合的子集,只接受兩個引數(子集)
$setUnion 返回包含在任何輸入集中出現的元素集。(並集)
$size 返回陣列中元素的數量。
$slice 返回陣列的子集。
$split 基於分隔符將字串拆分成子字串。返回一個子字串陣列。如果在字串中找不到分隔符,則返回包含原始字串的陣列。
$sqrt 計算平方根。
$stdDevPop 計算輸入值的總體標準差。3.2版本以後$group和$project都可以使用
$stdDevSamp 返回輸入值的抽樣標準差。3.2版本以後$group和$project都可以使用
$strcasecmp 忽略大小寫對字串進行比較:如果兩個字串相等返回0,字串大於第二個字串返回1,如果第一個字串小於第二個字串返回-1。
$strLenBytes 返回字串的utf-8編碼位元組數。
$strLenCP 返回字串中utf-8碼點的數目。
$substr 擷取子字串,不建議使用可以使用$substrBytes或$substrCP.
$substrBytes 返回字串的子字串。從字串中指定utf-8位元組索引(從0開始)的字元開始,並擷取指定的位元組數。
$substrCP 返回字串的子字串。從字串中指定utf-8碼點(Cp)索引(從0開始)的字元開始,並擷取指定的碼點數。
$subtract 返回第一個值減去第二個值的結果。如果這兩個值是數字,則返回差值。如果兩個值是日期,則返回毫秒數。如果兩個值是日期和毫秒數,則返回所產生的日期。接受兩個引數表示式。如果兩個值是日期和數字,則首先指定日期引數,因為它對從數字中減去日期是沒有意義的。
$sum 返回數值型別的值之和。忽略非數值型別的值。3.2版本以後$group和$project都可以使用
$switch 判斷一系列case表示式,當發現某一個表示式判斷為true, $switch執行指定表示式並中斷控制元件流
$toLower 將字串轉換為小寫。接受單個引數表示式。
$toUpper 將字串轉換為大寫。接受單個引數表示式。
$trunc 將數字重新定義為整數(Integer)。
$type 返回欄位的在BSON資料型別。
$week 返回日期的週數,作為介於0(一年中第一個星期日之前的部分周)和53(閏年)之間的日期。
$year 返回日期的數字表示(例如2014)。
$zip 將多個數組合併成一個數組,輸出陣列的第一個元素包含第一個輸入陣列的第一個元素和第二個陣列的第二個元素,以此類推,比如 轉換[ [ 1, 2, 3 ], [ “a”, “b”, “c” ] ] 成[ [ 1, “a” ], [ 2, “b” ], [ 3, “c” ] ].

查詢修飾語

原文連結

除了mongodb查詢操作符之外,還有一些“元”操作符,允許您修改查詢的輸出或行為。
從v3.2開始,查詢“元”操作符在shell中被否決。在shell中,使用遊標方法代替。
驅動程式介面(上篇中的方法)可以提供封裝這些選項的遊標方法。您可以使用下列語法中的任意一個新增下表的選項:

db.collection.find( { <query> } )._addSpecial( <option> )
db.collection.find( { $query: { <query> }, <option> } )
名稱 描述
$comment 向一個查詢添加註釋,以便在database profiler輸出中辨認查詢
$explain 使mongodb能夠報告查詢執行計劃,參考explain().
$hint 將mongodb用於使用特定索引。參考hint()
$maxScan 限制掃描檔案的數量。
$max 限制在一個查詢中使用索引時指定一個獨有的上限。參考max()
$maxTimeMS 指定用於處理遊標操作的累積毫秒時間限制。參考maxTimeMS()
$min 限制在一個查詢中使用索引時指定一個獨有的下限。參考min()
$orderby 返回一個指定排序規則排序好的文件列表的遊標。參考sort()
$query 封裝一個查詢文件
$returnKey 強制遊標只返回索引中包含的欄位
$showDiskLoc 修改返回的文件,以包含每個文件的磁碟位置的引用。
$natural 一個特殊的排序命令,該命令可以使用在磁碟上的文件的排序來排序文件