mongdb的聚合管道

来源:https://www.cnblogs.com/mxhmxh/archive/2018/09/04/9587978.html
-Advertisement-
Play Games

我們先介紹一下 MongoDB 的聚合功能,聚合操作主要用於對數據的批量處理,往往將記錄按條件分組以後,然後再進行一系列操作,例如,求最大值、最小值、平均值,求和等操作。聚合操作還能夠對記錄進行複雜的操作,主要用於數理統計和數據挖掘。在 MongoDB 中,聚合操作的輸入是集合中的文檔,輸出可以是一 ...


我們先介紹一下 MongoDB 的聚合功能,聚合操作主要用於對數據的批量處理,往往將記錄按條件分組以後,然後再進行一系列操作,例如,求最大值、最小值、平均值,求和等操作。聚合操作還能夠對記錄進行複雜的操作,主要用於數理統計和數據挖掘。在 MongoDB 中,聚合操作的輸入是集合中的文檔,輸出可以是一個文檔,也可以是多條文檔。在管道查詢過程中,上次查詢的結果可以為這次查詢的條件。

使用階段操作符之前,我們先看一下 article 集合中的文檔列表,也就是範例中用到的數據。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

>db.article.find().pretty()

{

   "_id": ObjectId("58e1d2f0bb1bbc3245fa7570")

   "title""MongoDB Aggregate",

   "author""liruihuan",

   "tags": ['Mongodb''Database''Query'],

   "pages": 5,

   "time" : ISODate("2017-04-09T11:42:39.736Z")

},

{

   "_id": ObjectId("58e1d2f0bb1bbc3245fa7571")

   "title""MongoDB Index",

   "author""liruihuan",

   "tags": ['Mongodb''Index''Query'],

   "pages": 3,

   "time" : ISODate("2017-04-09T11:43:39.236Z")

},

{

   "_id": ObjectId("58e1d2f0bb1bbc3245fa7572")

   "title""MongoDB Query",

   "author""eryueyang",

   "tags": ['Mongodb''Query'],

   "pages": 8,

   "time" : ISODate("2017-04-09T11:44:56.276Z")

}

 

1.1.1、$project 

作用

修改文檔的結構,可以用來重命名、增加或刪除文檔中的欄位。

範例1

只返迴文檔中 title 和 author 欄位

1

2

3

4

>db.article.aggregate([{$project:{_id:0, title:1, author:1 }}])

"title""MongoDB Aggregate",  "author""liruihuan" },

"title""MongoDB Index",  "author""liruihuan" },

"title""MongoDB Query",  "author""eryueyang" }

因為欄位 _id 是預設顯示的,這裡必須用 _id:0 把欄位_id過濾掉。

範例2

把文檔中 pages 欄位的值都增加10。並重命名成 newPages 欄位。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

>db.article.aggregate(

   [

      {

          $project:{

               _id:0,

               title:1,

               author:1,

               newPages: {$add:["$Pages",10]}

         }

      }

   ]

)

"title""MongoDB Aggregate",  "author""liruihuan""newPages": 15 },

"title""MongoDB Index",  "author""liruihuan""newPages": 13  },

"title""MongoDB Query",  "author""eryueyang""newPages": 18  }

其中,$add 是 加 的意思,是算術類型表達式操作符,具體表達式操作符,下麵會講到。

1.1.2、$match

作用

用於過濾文檔。用法類似於 find() 方法中的參數。

範例

查詢出文檔中 pages 欄位的值大於等於5的數據。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

>db.article.aggregate(

    [

         {

              $match: {"pages": {$gte: 5}}

         }

    ]

   ).pretty()

{

   "_id": ObjectId("58e1d2f0bb1bbc3245fa7570")

   "title""MongoDB Aggregate",

   "author""liruihuan",

   "tags": ['Mongodb''Database''Query'],

   "pages": 5,

   "time" : ISODate("2017-04-09T11:42:39.736Z")

},

{

   "_id": ObjectId("58e1d2f0bb1bbc3245fa7572")

   "title""MongoDB Query",

   "author""eryueyang",

   "tags": ['Mongodb''Query'],

   "pages": 8,

   "time" : ISODate("2017-04-09T11:44:56.276Z")

}

註:

  • 在 $match 中不能使用 $where 表達式操作符
  • 如果 $match 位於管道的第一個階段,可以利用索引來提高查詢效率
  • $match 中使用 $text 操作符的話,只能位於管道的第一階段
  • $match 儘量出現在管道的最前面,過濾出需要的數據,在後續的階段中可以提高效率。

1.1.3、$group

作用

將集合中的文檔進行分組,可用於統計結果。

範例

從 article 中得到每個 author 的文章數,並輸入 author 和對應的文章數。

1

2

3

4

5

6

7

8

9

>db.article.aggregate(

    [

         {

              $group: {_id: "$author", total: {$sum: 1}}

         }

    ]

   )

{"_id" "eryueyang""total" : 1}

{"_id" "liruihuan""total" : 2}

1.1.4、$sort

作用

將集合中的文檔進行排序。

範例

讓集合 article 以 pages 升序排列

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

>db.article.aggregate([{$sort: {"pages": 1}}]).pretty()

{

   "_id": ObjectId("58e1d2f0bb1bbc3245fa7571")

   "title""MongoDB Index",

   "author""liruihuan",

   "tags": ['Mongodb''Index''Query'],

   "pages": 3,

   "time" : ISODate("2017-04-09T11:43:39.236Z")

},

{

   "_id": ObjectId("58e1d2f0bb1bbc3245fa7570")

   "title""MongoDB Aggregate",

   "author""liruihuan",

   "tags": ['Mongodb''Database''Query'],

   "pages": 5,

   "time" : ISODate("2017-04-09T11:42:39.736Z")

},

{

   "_id": ObjectId("58e1d2f0bb1bbc3245fa7572")

   "title""MongoDB Query",

   "author""eryueyang",

   "tags": ['Mongodb''Query'],

   "pages": 8,

   "time" : ISODate("2017-04-09T11:44:56.276Z")

}

  如果以降序排列,則設置成 "pages": -1

1.1.5、$limit

作用

限制返回的文檔數量

範例

返回集合 article 中前兩條文檔

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

>db.article.aggregate([{$limit: 2}]).pretty()

{

   "_id": ObjectId("58e1d2f0bb1bbc3245fa7570")

   "title""MongoDB Aggregate",

   "author""liruihuan",

   "tags": ['Mongodb''Database''Query'],

   "pages": 5,

   "time" : ISODate("2017-04-09T11:42:39.736Z")

},

{

   "_id": ObjectId("58e1d2f0bb1bbc3245fa7571")

   "title""MongoDB Index",

   "author""liruihuan",

   "tags": ['Mongodb''Index''Query'],

   "pages": 3,

   "time" : ISODate("2017-04-09T11:43:39.236Z")

}

1.1.6、$skip

作用

跳過指定數量的文檔,並返回餘下的文檔。

範例

跳過集合 article 中一條文檔,輸出剩下的文檔

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

>db.article.aggregate([{$skip: 1}]).pretty()

{

   "_id": ObjectId("58e1d2f0bb1bbc3245fa7571")

   "title""MongoDB Index",

   "author""liruihuan",

   "tags": ['Mongodb''Index''Query'],

   "pages": 3,

   "time" : ISODate("2017-04-09T11:43:39.236Z")

},

{

   "_id": ObjectId("58e1d2f0bb1bbc3245fa7572")

   "title""MongoDB Query",

   "author""eryueyang",

   "tags": ['Mongodb''Query'],

   "pages": 8,

   "time" : ISODate("2017-04-09T11:44:56.276Z")

}

1.1.7、$unwind

作用

將文檔中數組類型的欄位拆分成多條,每條文檔包含數組中的一個值。

範例

把集合 article 中 title="MongoDB Aggregate" 的 tags 欄位拆分

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

>db.article.aggregate(

    [

         {

              $match: {"title""MongoDB Aggregate"}

         },

         {

              $unwind: "$tags"

         }

    ]

   ).pretty()

{

   "_id": ObjectId("58e1d2f0bb1bbc3245fa7570")

   "title""MongoDB Aggregate",

   "author""liruihuan",

   "tags""Mongodb",

   "pages": 5,

   "time" : ISODate("2017-04-09T11:42:39.736Z")

},

{

   "_id": ObjectId("58e1d2f0bb1bbc3245fa7570")

   "title""MongoDB Aggregate",

   "author""liruihuan",

   "tags""Database",

   "pages": 5,

   "time" : ISODate("2017-04-09T11:42:39.736Z")

},

{

   "_id": ObjectId("58e1d2f0bb1bbc3245fa7570")

   "title""MongoDB Aggregate",

   "author""liruihuan",

   "tags""Query",

   "pages": 5,

   "time" : ISODate("2017-04-09T11:42:39.736Z")

}

註:

  • $unwind 參數數組欄位為空或不存在時,待處理的文檔將會被忽略,該文檔將不會有任何輸出
  • $unwind 參數不是一個數組類型時,將會拋出異常
  • $unwind 所作的修改,只用於輸出,不能改變原文檔

1.2、表達式操作符

 表達式操作符有很多操作類型,其中最常用的有布爾管道聚合操作、集合操作、比較聚合操作、算術聚合操作、字元串聚合操作、數組聚合操作、日期聚合操作、條件聚合操作、數據類型聚合操作等。每種類型都有很多用法,這裡就不一一舉例了。

1.2.1、布爾管道聚合操作(Boolean Aggregation Operators)

名稱說明
$and Returns true only when all its expressions evaluate to true. Accepts any number of argument expressions.
$or Returns true when any of its expressions evaluates to true. Accepts any number of argument expressions.
$not Returns the boolean value that is the opposite of its argument expression. Accepts a single argument expression.

範例

假如有一個集合 mycol

1

2

3

4

5

"_id" : 1, "item" "abc1", description: "product 1", qty: 300 }

"_id" : 2, "item" "abc2", description: "product 2", qty: 200 }

"_id" : 3, "item" "xyz1", description: "product 3", qty: 250 }

"_id" : 4, "item" "VWZ1", description: "product 4", qty: 300 }

"_id" : 5, "item" "VWZ2", description: "product 5", qty: 180 }

確定 qty 是否大於250或者小於200

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

db.mycol.aggregate(

   [

     {

       $project:

          {

            item: 1,

            result: { $or: [ { $gt: [ "$qty", 250 ] }, { $lt: [ "$qty", 200 ] } ] }

          }

     }

   ]

)

"_id" : 1, "item" "abc1""result" true }

"_id" : 2, "item" "abc2""result" false }

"_id" : 3, "item" "xyz1""result" false }

"_id" : 4, "item" "VWZ1""result" true }

"_id" : 5, "item" "VWZ2""result" true }

1.2.2、集合操作(Set Operators)

用於集合操作,求集合的並集、交集、差集運算。

名稱說明
$setEquals Returns true if the input sets have the same distinct elements. Accepts two or more argument expressions.
$setIntersection Returns a set with elements that appear in all of the input sets. Accepts any number of argument expressions.
$setUnion Returns a set with elements that appear in any of the input sets. Accepts any number of argument expressions.
$setDifference Returns a set with elements that appear in the first set but not in the second set; i.e. performs a relative complement of the second set relative to the first. Accepts exactly two argument expressions.
$setIsSubset Returns true if all elements of the first set appear in the second set, including when the first set equals the second set; i.e. not a strict subset. Accepts exactly two argument expressions.
$anyElementTrue Returns true if any elements of a set evaluate to true; otherwise, returns false. Accepts a single argument expression.
$allElementsTrue Returns true if no element of a set evaluates to false, otherwise, returns false. Accepts a single argument expression.

範例

假如有一個集合 mycol

1

2

3

4

5

6

7

8

9

"_id" : 1, "A" : [ "red""blue" ], "B" : [ "red""blue" ] }

"_id" : 2, "A" : [ "red""blue" ], "B" : [ "blue""red""blue" ] }

"_id" : 3, "A" : [ "red""blue" ], "B" : [ "red""blue""green" ] }

"_id" : 4, "A" : [ "red""blue" ], "B" : [ "green""red" ] }

"_id" : 5, "A" : [ "red""blue" ], "B" : [ ] }

"_id" : 6, "A" : [ "red""blue" ], "B" : [ [ "red" ], [ "blue" ] ] }

"_id" : 7, "A" : [ "red""blue" ], "B" : [ [ "red""blue" ] ] }

"_id" : 8, "A" : [ ], "B" : [ ] }

"_id" : 9, "A" : [ ], "B" : [ "red" ] }

求出集合 mycol 中 A 和 B 的交集

1

2

3

4

5

6

7

8

9

10

11

12

13

14

db.mycol.aggregate(

   [

     { $project: { A:1, B: 1, allValues: { $setUnion: [ "$A""$B" ] }, _id: 0 } }

   ]

)

"A": [ "red""blue" ], "B": [ "red""blue" ], "allValues": [ "blue""red" ] }

"A": [ "red""blue" ], "B": [ "blue""red""blue" ], "allValues": [ "blue""red" ] }

"A": [ "red""blue" ], "B": [ "red""blue""green" ], "allValues": [ "blue""red""green" ] }

"A": [ "red""blue" ], "B": [ "green""red" ], "allValues": [ "blue""red""green" ] }

"A": [ "red""blue" ], "B": [ ], "allValues": [ "blue""red" ] }

"A": [ "red""blue" ], "B": [ [ "red" ], [ "blue" ] ], "allValues": [ "blue""red", [ "red" ], [ "blue" ] ] }

"A": [ "red""blue" ], "B": [ [ "red""blue" ] ], "allValues": [ "blue""red", [ "red""blue" ] ] }

"A": [ ], "B": [ ], "allValues": [ ] }

"A": [ ], "B": [ "red" ], "allValues": [ "red" ] }

1.2.3、比較聚合操作(Comparison Aggregation Operators)

名稱說明
$cmp Returns: 0 if the two values are equivalent, 1 if the first value is greater than the second, and -1 if the first value is less than the second.
$eq Returns true if the values are equivalent.
$gt Returns true if the first value is greater than the second.
$gte Returns true if the first value is greater than or equal to the second.
$lt Returns true if the first value is less than the second.
$lte Returns true if the first value is less than or equal to the second.
$ne Returns true if the values are not equivalent.

這裡就不舉例了,之前的例子有用到過。

1.2.4、算術聚合操作(Arithmetic Aggregation Operators)

名稱說明
$abs Returns the absolute value of a number.
$add Adds numbers to return the sum, or adds numbers and a date to return a new date. If adding numbers and a date, treats the numbers as milliseconds. Accepts any number of argument expressions, but at most, one expression can resolve to a date.
$ceil Returns the smallest integer greater than or equal to the specified number.
$divide Returns the result of dividing the first number by the second. Accepts two argument expressions.
$exp Raises e to the specified exponent.
$floor Returns the largest integer less than or equal to the specified number.
$ln Calculates the natural log of a number.
$log Calculates the log of a number in the specified base.
$log10 Calculates the log base 10 of a number.
$mod Returns the remainder of the first number divided by the second. Accepts two argument expressions.
$multiply Multiplies numbers to return the product. Accepts any number of argument expressions.
$pow Raises a number to the specified exponent.
$sqrt Calculates the square root.
$subtract Returns the result of subtracting the second value from the first. If the two values are numbers, return the difference. If the two values are dates, return the difference in milliseconds. If the two values are a date and a number in milliseconds, return the resulting date. Accepts two argument expressions. If the two values are a date and a number, specify the date argument first as it is not meaningful to subtract a date from a number.
$trunc Truncates a number to its integer.

範例

假如有一個集合 mycol

1

2

3

4

{ _id: 1, start: 5, end: 8 }

{ _id: 2, start: 4, end: 4 }

{ _id: 3, start: 9, end: 7 }

{ _id: 4, start: 6, end: 7 }

求集合 mycol 中 start 減去 end 的絕對值

1

2

3

4

5

6

7

8

9

db.mycol.aggregate([

   {

     $project: { delta: { $abs: { $subtract: [ "$start""$end" ] } } }

   }

])

"_id" : 1, "delta" : 3 }

"_id" : 2, "delta" : 0 }

"_id" : 3, "delta" : 2 }

"_id" : 4, "delta" : 1 }

1.2.5、字元串聚合操作(String Aggregation Operators)

名稱說明
$concat Concatenates any number of strings.
$indexOfBytes Searches a string for an occurence of a substring and returns the UTF-8 byte index of the first occurence. If the substring is not found, returns -1.
$indexOfCP Searches a string for an occurence of a substring and returns the UTF-8 code point index of the first occurence. If the substring is not found, returns -1.
$split Splits a string into substrings based on a delimiter. Returns an array of substrings. If the delimiter is not found within the string, returns an array containing the original string.
$strLenBytes Returns the number of UTF-8 encoded bytes in a string.
$strLenCP Returns the number of UTF-8 code points in a string.
$strcasecmp Performs case-insensitive string comparison and returns: 0 if two strings are equivalent, 1 if the first string is greater than the second, and -1 if the first string is less than the second.
$substr Deprecated. Use $substrBytes or $substrCP.
$substrBytes Returns the substring of a string. Starts with the character at the specified UTF-8 byte index (zero-based) in the string and continues for the specified number of bytes.
$substrCP Returns the substring of a string. Starts with the character at the specified UTF-8 code point (CP) index (zero-based) in the string and continues for the number of code points specified.
$toLower Converts a string to lowercase. Accepts a single argument expression.
$toUpper Converts a string to uppercase. Accepts a single argument expression.

範例

假如有一個集合 mycol

1

2

3

4

5

6

7

"_id" : 1, "city" "Berkeley, CA""qty" : 648 }

"_id" : 2, "city" "Bend, OR""qty" : 491 }

"_id" : 3, "city" "Kensington, CA""qty" : 233 }

"_id" : 4, "city" "Eugene, OR""qty" : 842 }

"_id" : 5, "city" "Reno, NV""qty" : 655 }

"_id" : 6, "city" "Portland, OR""qty" : 408 }

"_id" : 7, "city" "Sacramento, CA""qty" : 574 }

以 ',' 分割集合 mycol 中字元串city的值,用 $unwind 拆分成多個文檔,匹配出城市名稱只有兩個字母的城市,並求和各個城市中 qty 的值,最後以降序排序。

1

2

3

4

5

6

7

8

9

10

db.mycol.aggregate([

  { $project : { city_state : { $split: ["$city"", "] }, qty : 1 } },

  { $unwind : "$city_state" },

  { $match : { city_state : /[A-Z]{2}/ } },

  { $group : { _id: { "state" "$city_state" }, total_qty : { "$sum" "$qty" } } },

  { $sort : { total_qty : -1 } }

])

"_id" : { "state" "OR" }, "total_qty" : 1741 }

"_id" : { "state" "CA" }, "total_qty" : 1455 }

"_id" : { "state" "NV" }, "total_qty" : 655 }

1.2.6、數組聚合操作(Array Aggregation Operators)

 

名稱說明
$arrayElemAt Returns the element at the specified array index.
$concatArrays Concatenates arrays to return the concatenated array.
$filter Selects a subset of the array to return an array with only the elements that match the filter condition.
$indexOfArray Searches an array for an occurence of a specified value and returns the array index of the first occurence. If the substring is not found, returns -1.
$isArray Determines if the operand is an array. Returns a boolean.
$range Outputs an array containing a sequence of integers according to user-defined inputs.
$reverseArray Returns an array with the elements in reverse order.
$reduce Applies an expression to each element in an array and combines them into a single value.
$size Returns the number of elements in the array. Accepts a single expression as argument.
$slice Returns a subset of an array.
$zip Merge two lists together.
$in Returns a boolean indicating whether a specified value is in an array.

範例

假如有一個集合 mycol

1

2

3

4

"_id" : 1, "name" "dave123", favorites: [ "chocolate""cake""butter""apples" ] }

"_id" : 2, "name" "li", favorites: [ "apples""pudding""pie" ] }

"_id" : 3, "name" "ahn", favorites: [ "pears""pecans""chocolate""cherries" ] }

"_id" : 4, "name" "ty", favorites: [ "ice cream" ] }

求出集合 mycol 中 favorites 的第一項和最後一項

1

2

3

4

5

6

7

8

9

10

11

12

13

14

db.mycol.aggregate([

   {

     $project:

      {

         name: 1,

         first: { $arrayElemAt: [ "$favorites", 0 ] },

         last: { $arrayElemAt: [ "$favorites", -1 ] }

      }

   }

])

"_id" : 1, "name" "dave123""first" "chocolate""last" "apples" }

"_id" : 2, "name" "li""first" "apples""last" "pie" }

"_id" : 3, "name" "ahn""first" "pears""last" "cherries" }

"_id" : 4, "name" "ty""first" "ice cream""last" "ice cream" }

1.2.7、日期聚合操作(Date Aggregation Operators)

名稱說明
$dayOfYear Returns the day of the year for a date as a number between 1 and 366 (leap year).
$dayOfMonth Returns the day of the month for a date as a number between 1 and 31.
$dayOfWeek Returns the day of the week for a date as a number between 1 (Sunday) and 7 (Saturday).
$year Returns the year for a date as a number (e.g. 2014).
$month Returns the month for a date as a number between 1 (January) and 12 (December).
$week Returns the week number for a date as a number between 0 (the partial week that precedes the first Sunday of the year) and 53 (leap year).
$hour Returns the hour for a date as a number between 0 and 23.
$minute Returns the minute for a date as a number between 0 and 59.
$second Returns the seconds for a date as a number between 0 and 60 (leap seconds).
$millisecond Returns the milliseconds of a date as a number between 0 and 999.
$dateToString Returns the date as a formatted string.
$isoDayOfWeek Returns the weekday number in ISO 8601 format, ranging from 1 (for Monday) to 7 (for Sunday).
$isoWeek Returns the week number in ISO 8601 format, ranging from 1 to 53. Week numbers start at 1 with the week (Monday through Sunday) that contains the year’s first Thursday.
$isoWeekYear Returns the year number in ISO 8601 format. The year starts with the Monday of week 1 (ISO 8601) and ends with the Sunday of the last week (ISO 8601).

範例

假如有一個集合 mycol

1

"_id" : 1, "item" "abc""price" : 10, "quantity" : 2, "date" : ISODate("2017-01-01T08:15:39.736Z") }

得到集合 mycol 中 date 欄位的相關日期值

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

db.mycol.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" }

         }

     }

   ]

)

{

  "_id" : 1,

  "year" : 2017,

  "month" : 1,

  "day" : 1,

  "hour" : 8,

  "minutes" : 15,

  "seconds" : 39,

  "milliseconds" : 736,

  "dayOfYear" : 1,

  "dayOfWeek" : 1,

  "week" : 0

}

1.2.8、條件聚合操作(Conditional Aggregation Operators)

名稱說明
$cond A ternary operator that evaluates one expression, and depending on the result, returns the value of one of the other two expressions. Accepts either three expressions in an ordered list or three named parameters.
$ifNull Returns either the non-null result of the first expression or the result of the second expression if the first expression results in a null result. Null result encompasses instances of undefined values or missing fields. Accepts two expressions as arguments. The result of the second expression can be null.
$switch Evaluates a series of case expressions. When it finds an expression which evaluates to true$switch executes a specified expression and breaks out of the control flow.

範例

假如有一個集合 mycol

1

2

3

"_id" : 1, "item" "abc1", qty: 300 }

"_id" : 2, "item" "abc2", qty: 200 }

"_id" : 3, "item" "xyz1", qty: 250 }

如果集合 mycol 中 qty 欄位值大於等於250,則返回30,否則返回20

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

db.mycol.aggregate(

   [

      {

         $project:

           {

             item: 1,

             discount:

               {

                 $cond: { if: { $gte: [ "$qty", 250 ] }, then: 30, else: 20 }

               }

           }

      }

   ]

)

"_id" : 1, "item" "abc1""discount" : 30 }

"_id" : 2, "item" "abc2""discount" : 20 }

"_id" : 3, "item" "xyz1""discount" : 30 }<

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Linux 內核使用 task_struct 數據結構來關聯所有與進程有關的數據和結構,Linux 內核所有涉及到進程和程式的所有演算法都是圍繞該數據結構建立的,是內核中最重要的數據結構之一。 該數據結構在內核文件include/linux/sched.h中定義,在目前最新的Linux 4.5(截至目 ...
  • 一、簡單的多級菜單 顯示效果如下: ...
  • 如下圖所示,Checktime這個欄位有很多重覆數據,我需要把所有Checktime這個欄位重覆的都刪掉,但是還需要保留一條; 在Access做刪除查詢怎麼做呀,來個Access高手,複製粘貼黨請手下留情,謝謝。 ...
  • 背景介紹: 查詢MongoDB配置參數,可以知道關於最大連接數的參數是maxConns。但是連接實例後,查看支持的最大連接數,還是預設的819。 說明:最大連接數是由maxConn (maxIncomingConnections)和操作系統單個進程能打開的最大文件描述符數總量的80%決定的,取兩個之 ...
  • 一、簡單實現mysql一鍵安裝 參考:【第二章】MySQL資料庫基於Centos7.3-部署 此腳本前提條件是防火牆,selinux都已經設置完畢: 二、修改Mysql初始密碼 1)由於mysql5.7初始化是有密碼的,需要找到密碼才能登陸,所以我們直接通過腳本修改密碼,並實現登陸: 2)優化以上腳 ...
  • 今天遇到了一個關於LINKED SERVER查詢報錯的案例,鏈接伺服器鏈接ORACLE資料庫,測試沒有錯誤,但是執行腳本的時候,報如下錯誤: Msg 7399, Level 16, State 1, Line 1 The OLE DB provider "OraOLEDB.Oracle" for l... ...
  • [20180904]工作中一個錯誤.txt--//昨天看我提交一份修改建議,發現自己寫的sql語句存在錯誤.--//鏈接:http://blog.itpub.net/267265/viewspace-2213259/--//裡面提到:5f2atm993xz6wupdate PD_PMXS SET P ...
  • mysql 的主從錯誤跳過和mariadb的多源主從複製錯誤跳過操作不同,請註意: 更改會話的default_master_connection變數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...