AddToSet tổng hợp MongoDB

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

AddToSet tổng hợp MongoDB

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$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

AddToSet tổng hợp MongoDB

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

AddToSet tổng hợp MongoDB

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

AddToSet tổng hợp MongoDB

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

Toán tử tích lũy trong $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

AddToSet tổng hợp MongoDB

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 $avg1 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?

AddToSet tổng hợp MongoDB

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 $avg4

Chúng ta làm gì?

Chỉ cần thêm $avg4 vào $group

Nó không phải là khó khăn 😉

AddToSet tổng hợp MongoDB

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

AddToSet tổng hợp MongoDB

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 $avg4

AddToSet tổng hợp MongoDB

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ủ?

AddToSet tổng hợp MongoDB

$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 $avg4

AddToSet tổng hợp MongoDB

$min0

$min0 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 $min3 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ử $min0. Đây là cách

AddToSet tổng hợp MongoDB

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

$min6

Điều này rất giống với $min0 và hoàn toàn ngược lại

Như bạn có thể đã đoán, $min6 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

AddToSet tổng hợp MongoDB

Một giải pháp thay thế có thể là sắp xếp hồ sơ dựa trên ngày $max0 theo thứ tự giảm dần và sau đó sử dụng $min0. Bạn có quyền lựa chọn, nhưng tôi muốn chứng minh $min6

$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

AddToSet tổng hợp MongoDB

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ận

Trong 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ẻ 🙂

AddToSet tổng hợp MongoDB

ĐƯỢ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)