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ápCú 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óaVí 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óaGiả 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ệudb.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ốngTà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ạiVí 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ấpGiả 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: [ , .. ] }
0Tà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 4Cá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" }
}
}
]
]
1Thí dụ
{ $sum: [ , .. ] }
1Kết quả
{ $sum: [ , .. ] }
0Trong 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