Một số ví dụ về $group và các bộ tích lũy khác nhau [toán tử được sử dụng cùng với $group] như $push, $avg, $sum, $min, $max và $addToSet
Trong bài đăng này, tôi sẽ thảo luận về $group trong MongoDB Aggregation framework. Tôi sẽ lấy một số ví dụ về $group và các bộ tích lũy khác nhau [toán tử được sử dụng cùng với $group
] như $push
, $avg
, $sum
, $min
, $max
và $addToSet
$group
$group
chỉ cần nhóm các tài liệu đầu vào dựa trên các trường được chỉ định và đối với mỗi nhóm riêng biệt, nó xuất ra tài liệu kết quả. Phản hồi sẽ luôn có _id
duy nhất
Dưới đây là một minh họa để hiểu rõ hơn về khái niệm
Bạn cũng có thể có các trường được tính toán trong đầu ra $group
. Các giá trị này sẽ được tính toán bên trong nhóm. Nếu bạn muốn tính toán một chỉ số trong bộ sưu tập, thì bạn có thể nhóm theo _id
. vô giá trị. Chúng tôi sẽ lấy một ví dụ sau
Trước tiên hãy lấy một ví dụ đơn giản về nhóm
Giả sử chúng tôi có cơ sở dữ liệu Trò chơi, nơi chúng tôi có một bộ sưu tập để lưu trữ thông tin người dùng được gọi là người dùng và có một bộ sưu tập khác nơi chúng tôi lưu trữ điểm trò chơi được gọi là game_scores. Chúng tôi đang có tài liệu mẫu sau
Bây giờ nếu chúng tôi muốn tìm ra tất cả những người dùng duy nhất đã chơi trò chơi. Làm thế nào chúng ta sẽ làm mã nó?
Giải pháp – $group
Bạn thấy rằng trong tham số _id
, chúng tôi chuyển $user, vì chúng tôi chỉ muốn những người dùng duy nhất [chỉ nhóm theo trường người dùng], $ biểu thị rằng trường người dùng là từ các tài liệu đầu vào
Trên kết quả xuất ra, bạn có thể thấy có 4 người dùng duy nhất đã chơi trò chơi
Bây giờ bạn đã hiểu khái niệm cơ bản, hãy chuyển sang bộ tích lũy trong giai đoạn $group
$group
Toán tử bộ tích lũy về cơ bản là các hàm được áp dụng cho các trường của tài liệu đầu vào ngoài các trường được “nhóm” trong “_id”
Nói cách khác, chỉ những trường mà bạn có thể xuất ra ở dạng $group
ngoài _id
, mới được cộng dồn bằng cách sử dụng toán tử tích lũy
Tất cả các phần sau của bài đăng này sẽ cung cấp cho bạn ý tưởng hợp lý về các toán tử tích lũy trong $group
$push
Toán tử $push
đẩy các trường trong biểu thức vào một mảng. Bạn sẽ hiểu rõ hơn với ví dụ
Hãy tiếp tục với ví dụ trên. Điều gì sẽ xảy ra nếu chúng tôi muốn lấy tất cả điểm của từng người chơi duy nhất trong mảng
Bạn thấy rằng điểm số là trường mới, là một mảng có tất cả các trường $avg
1 của các tài liệu được nhóm
$avg
$avg
tính trung bình toán học của trường được đề cập trong biểu thức tích lũy
Nó bỏ qua các giá trị không phải là số
Một ví dụ đơn giản
Điểm trung bình của mỗi người dùng trong trò chơi là bao nhiêu?
Một ví dụ phức tạp nhỏ 🙂
Giả sử, chúng tôi muốn lấy điểm trò chơi trung bình của mỗi người dùng trong mỗi $avg
4
Chúng ta làm gì?
Chỉ cần thêm $avg
4 vào $group
Nó không phải là khó khăn 😉
Thông báo _id
hiện đã thay đổi thành một đối tượng [điều này là do bây giờ chúng tôi đang nhóm với 2 trường chứ không phải 1]. Đây là cách đầu ra trông như thế nào
Chỉ cần quan sát 3 tài liệu đầu tiên trong hình ảnh này. Bạn thấy trường người dùng được lặp lại với các giá trị gameMode khác nhau. Vì vậy, bây giờ bạn có điểm trung bình ở từng mức độ khó cho mỗi người dùng
Tái bút. Tôi đã cắt ngắn đầu ra trong ví dụ này để đơn giản 🙂
$sum
$sum
rất giống với $avg
. Sự khác biệt duy nhất là $sum
tính tổng [như tên đã gợi ý]
Ví dụ cho $sum
Giả sử, chúng tôi muốn tính số lần người dùng đã chơi trong mỗi $avg
4
Khá dễ dàng phải không? . Nhưng tôi muốn chứng minh $sum
$min
$min
tính toán giá trị tối thiểu của các trường không được nhóm trong một bộ tài liệu được nhóm
Ví dụ
Làm thế nào để tính điểm tối thiểu của mỗi game thủ?
$max
$max
tính toán giá trị tối đa của các trường không được nhóm trong một bộ tài liệu được nhóm
Ví dụ
Rất giống với phần trước, làm cách nào để tính điểm cao nhất cho mỗi người chơi trong mỗi $avg
4
$min
0$min
0 trả về kết quả của biểu thức đầu tiên trong nhóm các tài liệu chia sẻ cùng một $group
theo khóa
Đây sẽ không phải là một toán tử rất có ý nghĩa nếu không có giai đoạn $min
3 trước giai đoạn $group
. Tôi nghĩ bạn cần một ví dụ để làm rõ hơn
Ví dụ Giả sử, chúng tôi muốn tìm ra điểm số đầu tiên của mỗi người chơi trong cơ sở dữ liệu của chúng tôi
Chúng tôi sẽ sắp xếp game_scores theo thứ tự tăng dần của trường đã phát. Sau đó, chúng tôi sẽ nhóm theo người dùng và sử dụng toán tử $min
0. Đây là cách
Nếu bạn không sử dụng $sort làm giai đoạn đầu tiên của quy trình, thì $first sẽ không trả về bất kỳ kết quả có ý nghĩa nào
$min
6Điều này rất giống với $min
0 và hoàn toàn ngược lại
Như bạn có thể đã đoán, $min
6 trả về kết quả biểu thức cuối cùng trong nhóm tài liệu chia sẻ cùng một $group
theo khóa
Ví dụ, Cách tìm điểm mới nhất của từng người chơi trong cơ sở dữ liệu của chúng tôi
Một giải pháp thay thế có thể là sắp xếp hồ sơ dựa trên ngày $max
0 theo thứ tự giảm dần và sau đó sử dụng $min
0. Bạn có quyền lựa chọn, nhưng tôi muốn chứng minh $min
6
$addToSet
$addToSet
= $push
+ chỉ có các giá trị duy nhất trong mảng kết quả
Về cơ bản, những gì mà $addToSet
làm là lấy một nhóm các tài liệu có cùng một $group
bởi _id
. Và sau đó áp dụng biểu thức đã cho dưới dạng đối số [cho $addToSet
] trên từng tài liệu trong nhóm, rồi trả về mảng với các kết quả duy nhất
Hãy lấy một ví dụ nhanh
Từ bộ sưu tập game_score của chúng tôi, nếu chúng tôi cần tìm thì mỗi người dùng đã chơi chế độ trò chơi nào
Có thể có một số người dùng chỉ chơi ở chế độ khó, những người khác có thể chỉ chơi ở chế độ dễ và trung bình. Hãy cùng mã tìm hiểu
Hãy cho tôi biết nếu bạn vẫn còn nghi ngờ về bất kỳ điều nào trong số này
Phần kết luậnTrong bài đăng này, tôi đã thảo luận về một số khái niệm cơ bản xung quanh $group
được sử dụng trong MongoDB Aggregation Pipeline. Tôi hy vọng các ví dụ đủ đơn giản. Hãy cho tôi biết nếu bạn có bất kỳ nghi ngờ nào, hãy Tweet cho tôi tại @MohitSehgl
Hãy liên lạc, sẽ gặp bạn trong bài viết tiếp theo. Mã hóa vui vẻ 🙂
ĐƯỢC VIẾT BỞI
Mohit Sehgal
Muốn tác động tích cực đến thế giới. Nhà phát triển ngăn xếp đầy đủ, Ngăn xếp MEVN [MongoDB, Express. js, vue. js, nút. js]