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

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

Trong MongoDB, $sum toán tử đường ống tổng hợp tính toán và trả về tổng các giá trị số.

Cú pháp

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

Cú pháp 1:

 { $sum: <expression> } 

Cú pháp 2:

 { $sum: [ <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, $sum trả về tổng chung của tất cả các giá trị số là kết quả của việc áp dụng biểu thức đã chỉ định cho mỗi 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 1.

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

Ví dụ này sử dụng $sum kết hợp với $group để trả về tổng trên 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 $sum để trả về tổng của weight trường cho mỗi nhóm:

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

Kết quả:

 {"_id":"Kangaroo", "sum":430} {"_id":"Cat", "sum":27} {"_id":"Dog", "sum":60}  

Mảng

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

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

Kết quả:

 {"_id":1, "player":"Homer", "sum":29} {"_id":2, "player":"Marge", "sum":52} {"_id":3, "player":"Bart", "sum":38} {"_id":4, "player":"Brian", "sum":7} {"_id":5, "player":"Farnsworth "," sum ":0} {" _id ":6," player ":" Meg "," sum ":0} {" _id ":7," player ":" Ron "," sum ":0} 

Trong trường hợp này, bốn tài liệu đầu tiên trả về tổng các số khác nhau nằm 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ả lại 0 vì chúng tôi đã cung cấp một mảng trống.

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

Tài liệu 7 được trả lại 0 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 $sum với nhiều hơn một đối số. $sum sau đó tính tổng dựa trên 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 các tài liệu sau:

 {"_id":1, "a":1, "b":2, "c":3, "d":4} {"_id":2, "a":1, "b" :2, "c":3, "d":[4]} {"_id":3, "a":1, "b":2, "c":3, "d":"Này"} {"_id":4, "a":"Một", "b":"Hai", "c":"Ba", "d":"Bốn"} 

Chúng ta có thể sử dụng $sum để trả về tổng của a , b , cd các trường của mỗi tài liệu:

 db.data.aggregate(
   [
     {
       $project:
          {
            sum: { $sum: [ "$a", "$b", "$c", "$d" ] }
          }
     }
   ]
) 

Kết quả:

 {"_id":1, "sum":10} {"_id":2, "sum":6} {"_id":3, "sum":6} {"_id":4, " sum ":0} 

Tài liệu 1 trả về tổng các giá trị đầu vào của 1 , 2 , 34 .

Tuy nhiên, hai tài liệu tiếp theo chỉ trả về tổng giá trị đầu vào của 1 , 23 . $sum toán tử đã bỏ qua d của họ lĩnh vực.

Điều này là do $sum bỏ qua các giá trị không phải số. Vì vậy, trong trường hợp này, nó đã bỏ qua "Hey" trong tài liệu 3 và tính tổng từ các trường (số) còn lại.

Đối với tài liệu 2, d của nó trường chứa một mảng. Như đã đề cập, $sum toán tử bỏ qua mảng khi sử dụng cú pháp nhiều đối số. Chính xác hơn, nó coi các mảng là các giá trị không phải số khi được sử dụng trong ngữ cảnh này và $sum bỏ qua các giá trị không phải số.

Nếu tất cả các giá trị không phải là số, thì $sum trả về 0 . Chúng ta có thể thấy điều này với tài liệu 4.

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

Khi sử dụng cú pháp nhiều đối số, $sum 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ề 0 .

Ví dụ:

 db.data.aggregate(
   [
     {
       $project:
          {
            sum: { $sum: [ "$a", "$b", "$c", "$d", "$e" ] }
          }
     }
   ]
) 

Kết quả:

 {"_id":1, "sum":10} {"_id":2, "sum":6} {"_id":3, "sum":6} {"_id":4, " sum ":0} 

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. $sum đã tính tổng 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(
   [
     {
       $project:
          {
            result: { $sum: [ "$x", "$y", "$z" ] }
          }
     }
   ]
) 

Kết quả:

 {"_id":1, "result":0} {"_id":2, "result":0} {"_id":3, "result":0} {"_id":4, " kết quả ":0} 

Kết quả là 0 cho tất cả các tài liệu.

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 0 .

Ví dụ:

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

Kết quả:

 {"_id":"Cat", "sum":0} {"_id":"Dog", "sum":0} {"_id":"Kangaroo", "sum":0}  

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

$sum 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. Suy nghĩ của MongoDB và PostgreSQL

  2. So sánh ngày trong mongodb

  3. sử dụng $ và với $ match trong mongodb

  4. Tìm bản ghi trùng lặp trong MongoDB

  5. Giám sát Máy chủ Percona cho MongoDB - Các chỉ số chính