MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Nhà điều hành đường ống tổng hợp MongoDB $ max

Trong MongoDB, $max toán tử đường ống tổng hợp trả về giá trị lớn nhất từ ​​một biểu thức.

Cú pháp

$max toán tử hỗ trợ hai cú pháp.

Cú pháp 1:

 { $max: <expression> } 

Cú pháp 2:

 { $max: [ <expression1>, <expression2> ... ]  } 

Cú pháp đầu tiên chấp nhận một đối số và cú pháp thứ hai chấp nhận nhiều đối số.

Khi được sử dụng trong nhóm $group giai đoạn này, bạn chỉ có thể sử dụng cú pháp đầu tiên. Trong trường hợp này, $max trả về giá trị lớn nhất là kết quả của việc áp dụng một biểu thức cho từng tài liệu trong một nhóm tài liệu chia sẻ cùng một nhóm theo khóa.

Ví dụ về Cú pháp 1 (Đối số Đơn)

Dưới đây là một số ví dụ sử dụng cú pháp đối số duy nhất.

Tài liệu được Nhóm

Ví dụ này sử dụng $max kết hợp với $group để trả về giá trị lớn nhất từ ​​một nhóm tài liệu được nhóm theo khóa.

Giả sử chúng ta có một bộ sưu tập có tên là pets với các tài liệu sau:

 {"_id":1, "name":"Wag", "type":"Dog", "weight":20} {"_id":2, "name":"Bark", "type" :"Dog", "weight":10} {"_id":3, "name":"Meo meo", "type":"Cat", "weight":7} {"_id":4, "name" :"Scratch", "type":"Cat", "weight":8} {"_id":5, "name":"Bruce", "type":"Kangaroo", "weight":100} {" _id ":6," name ":" Hop "," type ":" Kangaroo "," weight ":130} {" _id ":7," name ":" Punch "," type ":" Kangaroo ", "weight":200} {"_id":8, "name":"Snap", "type":"Cat", "weight":12} {"_id":9, "name":"Ruff", "type":"Dog", "weight":30} 

Chúng tôi có thể nhóm các tài liệu này theo type của chúng và sau đó sử dụng $max để trả về giá trị lớn nhất của weight trường cho mỗi nhóm:

 db.pets.aggregate(
   [
     {
       $group:
          {
            _id: "$type",
            max: { $max: "$weight" }
          }
     }
   ]
) 

Kết quả:

 {"_id":"Kangaroo", "max":200} {"_id":"Cat", "max":12} {"_id":"Dog", "max":30}  

Mảng

Ví dụ này áp dụng $max vào một tài liệu duy nhất có chứa một trường với một mảng giá trị.

Tùy chọn này chỉ khả dụng khi sử dụng cú pháp đối số duy nhất. Mảng bị bỏ qua khi sử dụng cú pháp nhiều đối số (thông tin thêm về điều này bên dưới).

Giả sử chúng ta có một bộ sưu tập có tên là players với các tài liệu sau:

 {"_id":1, "player":"Homer", "score":[1, 7, 2, 3, 8, 7, 1]} {"_id":2, "player":" Marge "," điểm ":[0, 1, 8, 17, 18, 8]} {" _id ":3," player ":" Bart "," score ":[15, 11, 8, 0, 1 , 3]} {"_id":4, "player":"Brian", "Score":[7]} {"_id":5, "player":"Farnsworth", "Score":[]} { "_id":6, "player":"Meg", "score":null} {"_id":7, "player":"Ron"} 

Chúng tôi có thể áp dụng $max đến điểm scores trường trong mỗi tài liệu:

 db.players.aggregate(
   [
     {
       $project:
          {
            player: 1,
            max: { $max: "$scores" }
          }
     }
   ]
) 

Kết quả:

 {"_id":1, "player":"Homer", "max":8} {"_id":2, "player":"Marge", "max":18} {"_id":3, "player":"Bart", "max":15} {"_id":4, "player":"Brian", "max":7} {"_id":5, "player":"Farnsworth "," max ":null} {" _id ":6," player ":" Meg "," max ":null} {" _id ":7," player ":" Ron "," max ":null} 

Trong trường hợp này, bốn tài liệu đầu tiên trả về giá trị lớn nhất từ ​​các số khác nhau trong các mảng tương ứng của chúng.

Trong trường hợp của tài liệu 4, số này giống với số vì chỉ có một số trong mảng.

Tài liệu 5 được trả về null vì chúng tôi đã cung cấp một mảng trống.

Tài liệu 6 trả về null bởi vì chúng tôi đã cung cấp null như đối số.

Tài liệu 7 trả về null bởi vì trường thậm chí không tồn tại.

Ví dụ về Cú pháp 2 (Nhiều đối số)

Cú pháp thứ hai liên quan đến việc cung cấp $max với nhiều hơn một đối số. $max sau đó trả về giá trị lớn nhất từ ​​tất cả các đối số được cung cấp.

Giả sử chúng ta có một tập hợp được gọi là data với tài liệu sau:

 {"_id":1, "a":10, "b":500, "c":-900, "d":4} 

Chúng tôi có thể sử dụng $max để trả về giá trị lớn nhất từ ​​a , b , cd lĩnh vực:

 db.data.aggregate(
   [
     { $match: { _id: { $in: [ 1 ] } } },
     {
       $project:
          {
            max: { $max: [ "$a", "$b", "$c", "$d" ] }
          }
     }
   ]
) 

Kết quả:

 {"_id":1, "max":500} 

Trong trường hợp này, 500 là giá trị lớn nhất.

Các trường bị thiếu

Khi sử dụng cú pháp nhiều đối số, $max bỏ qua bất kỳ trường nào bị thiếu. Có nghĩa là, nếu bạn cung cấp một trường không tồn tại, nó sẽ bỏ qua nó. Nếu không có trường nào tồn tại, thì nó trả về null .

Ví dụ:

 db.data.aggregate(
   [
     { $match: { _id: { $in: [ 1 ] } } },
     {
       $project:
          {
            max: { $max: [ "$a", "$b", "$c", "$d", "$e" ] }
          }
     }
   ]
) 

Kết quả:

 {"_id":1, "max":500} 

Trong trường hợp này, tôi đã cung cấp thêm một trường ($e ) không tồn tại trong tài liệu. $max đã tính giá trị lớn nhất dựa trên các trường còn lại do tồn tại.

Tuy nhiên, đây là những gì sẽ xảy ra khi không có trong số các trường tồn tại:

 db.data.aggregate(
   [
     { $match: { _id: { $in: [ 1 ] } } },
     {
       $project:
          {
            result: { $max: [ "$x", "$y", "$z" ] }
          }
     }
   ]
) 

Kết quả:

 {"_id":1, "kết quả":null} 

Kết quả là null .

Như chúng ta đã thấy trước đó, khi sử dụng cú pháp một đối số, một trường bị thiếu dẫn đến null .

Ví dụ:

 db.pets.aggregate(
   [
     {
       $group:
          {
            _id: "$type",
            max: { $max: "$oops!" }
          }
     }
   ]
) 

Kết quả:

 {"_id":"Dog", "max":null} {"_id":"Kangaroo", "max":null} {"_id":"Cat", "max":null}  

So sánh các loại khác nhau

$max toán tử so sánh cả giá trị và kiểu. Khi các giá trị thuộc các loại khác nhau, $max tính toán giá trị lớn nhất dựa trên thứ tự so sánh BSON.

Giả sử bộ sưu tập của chúng tôi chứa các tài liệu sau:

 {"_id":2, "a":1, "b":2, "c":3, "d":[1]} {"_id":3, "a":1, " b ":2," c ":3," d ":" 1 "} {" _id ":4," a ":" Một "," b ":" Hai "," c ":" Ba ", "d":"Four"} {"_id":5, "a":ISODate ("1999-01-03T23:30:15.100Z"), "b":ISODate ("2000-01-03T23:30:15.100Z ")} {" _id ":6," a ":ISODate (" 1999-01-03T23:30:15.100Z ")," b ":" 2000-01-03T23:30:15.100Z "} 

Ngoại trừ tài liệu 4, mỗi tài liệu đó sử dụng các loại hỗn hợp (có ít nhất một loại khác với các loại khác trên các trường dữ liệu). Tài liệu 4 sử dụng các chuỗi trong cả bốn trường.

Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $max đối với các tài liệu đó:

 db.data.aggregate(
   [
     { $match: { _id: { $in: [ 2, 3, 4, 5, 6 ] } } },
     {
       $project:
          {
            max: { $max: [ "$a", "$b", "$c", "$d" ] }
          }
     }
   ]
) 

Kết quả:

 {"_id":2, "max":[1]} {"_id":3, "max":"1"} {"_id":4, "max":"Hai"} {" _id ":5," max ":ISODate (" 2000-01-03T23:30:15.100Z ")} {" _id ":6," max ":ISODate (" 1999-01-03T23:30:15.100Z " )} 

tài liệu có _id trong tổng số 2 , mảng lớn hơn số, do đó, mảng được trả về (ngay cả khi phần tử của nó là một số nhỏ hơn một số các số khác).

Tài liệu 3:Chuỗi lớn hơn số và do đó, chuỗi được trả về.

Tài liệu 4:Tất cả các trường đều là chuỗi, và vì vậy Two là chuỗi lớn nhất.

Tài liệu 5:Hai ngày được cung cấp và do đó, ngày sau đó sẽ được trả lại.

Tài liệu 6:Trong trường hợp này, một đối tượng Ngày và một chuỗi ngày được cung cấp. Đối tượng ngày lớn hơn chuỗi và do đó đối tượng Ngày được trả về (ngay cả khi ngày của nó sớm hơn ngày của chuỗi).

Các giai đoạn có sẵn

$max có sẵn trong các giai đoạn sau:

  • $group
  • $project
  • $addFields
  • $set
  • $replaceRoot
  • $replaceWith
  • $match giai đoạn bao gồm $expr biểu hiện

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Quy mô liền mạch cho máy chủ MongoDB của bạn

  2. 'Giao dịch' nhiều bộ sưu tập, nhiều tài liệu trong MongoDB

  3. Cách thay thế chuỗi trong tất cả các tài liệu trong Mongo

  4. MongoDB $ isNumber

  5. Sự cố MongoDB \ uXXXX