Nhóm truy vấn MongoDB theo ví dụ tổng

Thao tác truy vấn tổng MongoDB (tổng hợp) được sử dụng đơn giản để tính toán và trả về tổng của các giá trị số. Điều quan trọng cần lưu ý là hoạt động bỏ qua các giá trị không phải là số. Ngoài ra, nếu một trường không tồn tại được chuyển, toán tử sẽ trả về giá trị 0

Hành vi của truy vấn tổng MongoDB đã được thay đổi trong MongoDB 5. 0 và hiện được cung cấp với một số hoạt động hoặc giai đoạn khác. Trong MongoDB 3. 2 trở về trước, nó chỉ khả dụng ở vòng bảng $

Hướng dẫn này nhằm mục đích cung cấp các ví dụ để bạn có thể hiểu cách sử dụng toán tử truy vấn tổng MongoDB. Vì vậy, hãy để chúng tôi bắt đầu hướng dẫn nhanh chóng và dễ dàng này

Cú pháp truy vấn tổng MongoDB

Cú pháp của toán tử $sum thay đổi tùy theo số lượng biểu thức mà người dùng muốn thao tác trên đó

Đối với một biểu thức toán hạng duy nhất

{ $sum:  }

Đối với danh sách nhiều biểu thức toán hạng

{ $sum: [ ,  .. ]  }

Loại dữ liệu kết quả

Ngoại trừ trường hợp nó không thể được thể hiện đầy đủ trong loại đó, kết quả sẽ cùng loại với đầu vào. Trong những trường hợp này

  • Nếu kết quả có thể biểu thị dưới dạng số nguyên 64 bit, thì số nguyên 32 bit sẽ được thay đổi thành số nguyên 64 bit
  • Nếu kết quả không thể được biểu diễn dưới dạng số nguyên 64 bit, thì số nguyên 32 bit sẽ được chuyển thành số kép
  • Nếu kết quả không thể được biểu diễn dưới dạng số nguyên 64 bit, nó sẽ được đổi thành số kép

Sử dụng MongoDB Sum Query trong Mongo Shell

Hãy để chúng tôi lấy một vài ví dụ từ các tài liệu chính thức để hiểu cách sử dụng thao tác truy vấn tổng MongoDB

Trong MongoDB, toán tử đường dẫn tổng hợp

{ $sum: [ ,  .. ]  }
7 tính toán và trả về tổng các giá trị số

cú pháp

Toán tử

{ $sum: [ ,  .. ]  }
7 hỗ trợ hai cú pháp

Cú pháp 1

{ $sum:  }

Cú pháp 2

{ $sum: [ ,  .. ]  }

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 giai đoạn

{ $sum: [ ,  .. ]  }
9, bạn chỉ có thể sử dụng cú pháp đầu tiên. Trong trường hợp này,
{ $sum: [ ,  .. ]  }
7 trả về tổng của tất cả các giá trị số có được từ việc áp dụng biểu thức đã chỉ định 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 vài ví dụ sử dụng cú pháp 1

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

Ví dụ này sử dụng

{ $sum: [ ,  .. ]  }
7 kết hợp với
{ $sum: [ ,  .. ]  }
9 để 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 tên là

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "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 }
3 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" : "Meow", "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 ta có thể nhóm các tài liệu này theo trường

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "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 }
4 của chúng, sau đó sử dụng
{ $sum: [ ,  .. ]  }
7 để trả về tổng của trường
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "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 }
6 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: [ ,  .. ]  }
7 cho một tài liệu có chứa một trường có một mảng các giá trị

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

Giả sử chúng ta có một bộ sưu tập tên là

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "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 }
8 với các tài liệu sau

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

Chúng ta có thể áp dụng

{ $sum: [ ,  .. ]  }
7 cho trường
db.pets.aggregate(
   [
     {
       $group:
          {
            _id: "$type",
            sum: { $sum: "$weight" }
          }
     }
   ]
)
0 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ủa các số khác nhau trong 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 trả về

db.pets.aggregate(
   [
     {
       $group:
          {
            _id: "$type",
            sum: { $sum: "$weight" }
          }
     }
   ]
)
1 vì chúng tôi đã cung cấp một mảng trống

Tài liệu 6 đã trả lại

db.pets.aggregate(
   [
     {
       $group:
          {
            _id: "$type",
            sum: { $sum: "$weight" }
          }
     }
   ]
)
1 vì chúng tôi đã cung cấp
db.pets.aggregate(
   [
     {
       $group:
          {
            _id: "$type",
            sum: { $sum: "$weight" }
          }
     }
   ]
)
3 làm đối số

Tài liệu 7 trả về

db.pets.aggregate(
   [
     {
       $group:
          {
            _id: "$type",
            sum: { $sum: "$weight" }
          }
     }
   ]
)
1 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: [ ,  .. ]  }
7 với nhiều hơn một đối số.
{ $sum: [ ,  .. ]  }
7 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 bộ sưu tập tên là

db.pets.aggregate(
   [
     {
       $group:
          {
            _id: "$type",
            sum: { $sum: "$weight" }
          }
     }
   ]
)
7 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" : "Hey" }
{ "_id" : 4, "a" : "One", "b" : "Two", "c" : "Three", "d" : "Four" }

Chúng ta có thể sử dụng

{ $sum: [ ,  .. ]  }
7 để trả về tổng của các trường
db.pets.aggregate(
   [
     {
       $group:
          {
            _id: "$type",
            sum: { $sum: "$weight" }
          }
     }
   ]
)
9,
{ "_id" : "Kangaroo", "sum" : 430 }
{ "_id" : "Cat", "sum" : 27 }
{ "_id" : "Dog", "sum" : 60 }
0,
{ "_id" : "Kangaroo", "sum" : 430 }
{ "_id" : "Cat", "sum" : 27 }
{ "_id" : "Dog", "sum" : 60 }
1 và
{ "_id" : "Kangaroo", "sum" : 430 }
{ "_id" : "Cat", "sum" : 27 }
{ "_id" : "Dog", "sum" : 60 }
2 của mỗi tài liệu

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

Kết quả

{ $sum: [ ,  .. ]  }
0

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

{ "_id" : "Kangaroo", "sum" : 430 }
{ "_id" : "Cat", "sum" : 27 }
{ "_id" : "Dog", "sum" : 60 }
3,
{ "_id" : "Kangaroo", "sum" : 430 }
{ "_id" : "Cat", "sum" : 27 }
{ "_id" : "Dog", "sum" : 60 }
4,
{ "_id" : "Kangaroo", "sum" : 430 }
{ "_id" : "Cat", "sum" : 27 }
{ "_id" : "Dog", "sum" : 60 }
5 và
{ "_id" : "Kangaroo", "sum" : 430 }
{ "_id" : "Cat", "sum" : 27 }
{ "_id" : "Dog", "sum" : 60 }
6

Tuy nhiên, hai tài liệu tiếp theo chỉ trả về tổng giá trị đầu vào của

{ "_id" : "Kangaroo", "sum" : 430 }
{ "_id" : "Cat", "sum" : 27 }
{ "_id" : "Dog", "sum" : 60 }
3,
{ "_id" : "Kangaroo", "sum" : 430 }
{ "_id" : "Cat", "sum" : 27 }
{ "_id" : "Dog", "sum" : 60 }
4 và
{ "_id" : "Kangaroo", "sum" : 430 }
{ "_id" : "Cat", "sum" : 27 }
{ "_id" : "Dog", "sum" : 60 }
5. Toán tử
{ $sum: [ ,  .. ]  }
7 đã bỏ qua các trường
{ "_id" : "Kangaroo", "sum" : 430 }
{ "_id" : "Cat", "sum" : 27 }
{ "_id" : "Dog", "sum" : 60 }
2 của họ

Điều này là do

{ $sum: [ ,  .. ]  }
7 bỏ qua các giá trị không phải là số. Vì vậy, trong trường hợp này, nó đã bỏ qua
{ "_id" : 1, "player" : "Homer", "scores" : [ 1, 7, 2, 3, 8, 7, 1 ] }
{ "_id" : 2, "player" : "Marge", "scores" : [ 0, 1, 8, 17, 18, 8 ] }
{ "_id" : 3, "player" : "Bart", "scores" : [ 15, 11, 8, 0, 1, 3 ] }
{ "_id" : 4, "player" : "Brian", "scores" : [ 7 ] }
{ "_id" : 5, "player" : "Farnsworth", "scores" : [ ] }
{ "_id" : 6, "player" : "Meg", "scores" : null }
{ "_id" : 7, "player" : "Ron" }
3 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, trường

{ "_id" : "Kangaroo", "sum" : 430 }
{ "_id" : "Cat", "sum" : 27 }
{ "_id" : "Dog", "sum" : 60 }
2 của nó chứa một mảng. Như đã đề cập, toán tử
{ $sum: [ ,  .. ]  }
7 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 là số khi được sử dụng trong ngữ cảnh này và
{ $sum: [ ,  .. ]  }
7 bỏ qua các giá trị không phải là số

Nếu tất cả các giá trị không phải là số, thì

{ $sum: [ ,  .. ]  }
7 trả về
db.pets.aggregate(
   [
     {
       $group:
          {
            _id: "$type",
            sum: { $sum: "$weight" }
          }
     }
   ]
)
1. 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: [ ,  .. ]  }
7 sẽ bỏ qua mọi trường bị thiếu. 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ề
db.pets.aggregate(
   [
     {
       $group:
          {
            _id: "$type",
            sum: { $sum: "$weight" }
          }
     }
   ]
)
1

Thí dụ

{ $sum: [ ,  .. ]  }
1

Kết quả

{ $sum: [ ,  .. ]  }
0

Trong trường hợp này, tôi đã cung cấp thêm một trường (_______22_______1) không tồn tại trong tài liệu.

{ $sum: [ ,  .. ]  }
7 đã tính tổng dựa trên các trường còn lại tồn tại

$sum 1 trong MongoDB là gì?

1 câu trả lời. Trong MongoDB, $sum sẽ cộng giá trị của biểu thức cho mỗi hàng và trong trường hợp của bạn, bạn có 3 hàng nên nó sẽ là 1 .

Làm cách nào để sử dụng số lượng trong nhóm trong MongoDB?

Chúng ta có thể sử dụng đoạn mã sau để nhóm theo trường 'vị trí' và đếm số lần xuất hiện của từng vị trí. .
Vị trí 'Chuyển tiếp' xảy ra 1 lần
Vị trí 'Guard' xảy ra 3 lần
Vị trí 'Trung tâm' xuất hiện 1 lần

Làm cách nào để nhóm mảng đối tượng theo khóa trong MongoDB?

Nhóm và đẩy các đối tượng trong mảng nếu chúng có cùng khóa trong tài liệu mongodb .
$unwind giải cấu trúc mảng appInfos
$group theo tài nguyên và app_key và xây dựng mảng siêu dữ liệu
một lần nữa $group chỉ bằng tài nguyên và xây dựng lại mảng appInfos mà chúng tôi đã giải cấu trúc trong giai đoạn đầu tiên

Tập hợp nhóm trong MongoDB là gì?

Các thao tác tổng hợp trong MongoDB xử lý các bản ghi/tài liệu dữ liệu và trả về các kết quả được tính toán. Tính năng tổng hợp thu thập các giá trị từ nhiều tài liệu khác nhau, nhóm chúng lại rồi thực hiện các thao tác khác nhau như Tổng, Trung bình, Tối thiểu, Tối đa, v.v. trên dữ liệu được nhóm đó để trả về kết quả được tính toán.