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

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

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

Cú pháp

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

Cú pháp 1:

 { $min: <expression> } 

Cú pháp 2:

 { $min: [ <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, $min trả về giá trị nhỏ 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 $min kết hợp với $group để trả về giá trị tối thiểu 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 $min để trả về giá trị nhỏ nhất của weight trường cho mỗi nhóm:

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

Kết quả:

 {"_id":"Kangaroo", "min":100} {"_id":"Dog", "min":10} {"_id":"Cat", "min":7}  

Mảng

Ví dụ này áp dụng $min 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 $min đến điểm scores trường trong mỗi tài liệu:

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

Kết quả:

 {"_id":1, "player":"Homer", "min":1} {"_id":2, "player":"Marge", "min":0} {"_id":3, "player":"Bart", "min":0} {"_id":4, "player":"Brian", "min":7} {"_id":5, "player":"Farnsworth "," min ":null} {" _id ":6," player ":" Meg "," min ":null} {" _id ":7," player ":" Ron "," min ":null} 

Trong trường hợp này, bốn tài liệu đầu tiên trả về giá trị nhỏ 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 $min với nhiều hơn một đối số. $min sau đó trả về giá trị nhỏ 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 $min để trả về giá trị nhỏ nhất từ ​​a , b , cd lĩnh vực:

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

Kết quả:

 {"_id":1, "min":-900} 

Trong trường hợp này, -900 là giá trị tối thiểu.

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

Khi sử dụng cú pháp nhiều đối số, $min 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:
          {
            min: { $min: [ "$a", "$b", "$c", "$d", "$e" ] }
          }
     }
   ]
) 

Kết quả:

 {"_id":1, "min":-900} 

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. $min đã tính giá trị tối thiểu 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: { $min: [ "$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",
            min: { $min: "$oops!" }
          }
     }
   ]
) 

Kết quả:

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

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

$min 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, $min tính toán giá trị tối thiểu 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":[0]} {"_id":3, "a":1, " b ":2," c ":3," d ":" 0 "} {" _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 $min đối với các tài liệu đó:

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

Kết quả:

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

Về tài liệu có _id trong tổng số 2 , số nhỏ hơn mảng, vì vậy số 1 được trả về (mặc dù mảng chứa một số nhỏ hơn tất cả các số khác).

Tài liệu 3:Các số nhỏ hơn chuỗi và do đó, số thấp nhất được trả về.

Tài liệu 4:Tất cả các trường đều là chuỗi, và vì vậy Four là chuỗi tối thiểu.

Tài liệu 5:Hai ngày được cung cấp và do đó ngày trước đó đượ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. Chuỗi ít hơn đối tượng Ngày, và do đó, chuỗi được trả về (ngay cả khi ngày của nó muộn hơn đối tượng Ngày).

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

$min 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. Giá trị khác biệt đếm MongoDB?

  2. MongoDB $ isNumber

  3. Tổng hợp $ lookup Tổng kích thước của tài liệu trong đường dẫn phù hợp vượt quá kích thước tài liệu tối đa

  4. Truy vấn MongoDB / Mongoose vào một ngày cụ thể?

  5. Làm cách nào để tạo Hình ảnh Docker Mongo với các bộ sưu tập và dữ liệu mặc định?