Đếm la bàn MongoDB

Không giống như cơ sở dữ liệu quan hệ, MongoDB cho phép bạn tạo các đường ống để thao tác và trích xuất số liệu thống kê theo cách đơn giản và trực quan. Với các phiên bản mới nhất, quy trình tổng hợp đã được giới thiệu, dựa trên ý tưởng tạo khung xử lý dữ liệu. Các tài liệu trong bộ sưu tập nhập quy trình nhiều bước để chuyển đổi tài liệu thành kết quả tổng hợp. Các hoạt động trong mỗi bước cho phép, ví dụ, các giá trị từ nhiều tài liệu được nhóm lại với nhau, số liệu thống kê được tính toán và thông tin từ các tài liệu khác được tích hợp với mục tiêu trả về một kết quả duy nhất.  

Trong hướng dẫn này, chúng ta sẽ khám phá một số thao tác hữu ích và được sử dụng nhiều nhất do khung tổng hợp đề xuất thông qua các ví dụ. Chúng tôi sẽ tận dụng các cơ sở dữ liệu mẫu được cung cấp với bản cài đặt MongoDB Atlas miễn phí và xây dựng các đường ống bằng giao diện đồ họa do MongoDB Compass cung cấp. Để có được môi trường cloud hoàn toàn miễn phí để thực hành các bạn có thể tham khảo bài viết MongoDB Atlas – tạo môi trường cloud để thực hành. Mặt khác, nếu bạn đã có sẵn MongoDB Atlas, bạn có thể tham khảo bài viết MongoDB Compass – dễ dàng truy vấn và phân tích cơ sở dữ liệu NoSQL để tìm hiểu cách kết nối với đám mây, thực hành một số truy vấn và thực hành sử dụng công cụ MongoDB Compass

Trích xuất số liệu thống kê

Đường dẫn tổng hợp thường được sử dụng để trích xuất số liệu thống kê. Đối với ví dụ này, chúng tôi sẽ sử dụng cơ sở dữ liệu sample_training và đặc biệt là bộ sưu tập điểm. Mỗi tài liệu của bộ sưu tập này chứa id của sinh viên, id của lớp và một vectơ của các tài liệu được nhúng bao gồm trường loại và điểm số

Nếu bạn muốn tìm điểm trung bình cho từng loại điểm, bạn sẽ cần sử dụng đường dẫn tổng hợp. MongoDB Compass cho phép chúng tôi tạo đường dẫn tổng hợp một cách tương tác, xác minh rằng kết quả của từng giai đoạn là chính xác cả về mặt cú pháp và ở cấp độ của bộ tài liệu được trả về. Để bắt đầu làm quen với phương pháp trích xuất dữ liệu này hoặc để kiểm tra các truy vấn phức tạp, đây là công cụ tốt nhất

Đếm la bàn MongoDB

Quay trở lại ví dụ, trước tiên chúng ta cần giải nén vectơ điểm để phép tính của chúng ta được thực hiện trên tất cả các điểm có trong mỗi tài liệu. Vì lý do này, chúng tôi sử dụng toán tử $unwind. Như bạn có thể thấy trong hình, ở bên trái, chúng tôi sẽ xác định toán tử và các tham số được yêu cầu, trong khi ở bên phải, ngay sau khi khối đường ống được định cấu hình đúng, chúng tôi sẽ nhận được bản xem trước của các tài liệu được trả về bởi giai đoạn . Giai đoạn sẽ được xác định như sau

{path: "$scores" } 

Chú ý

Ký hiệu $ trước tên thuộc tính được sử dụng để cho biết rằng bạn muốn sử dụng các giá trị bên trong trường. Đối với toán tử $unwind, biểu tượng này phải luôn xuất hiện

Những gì bạn nhận được là một tài liệu cho từng phần tử của vectơ điểm số. Mỗi tài liệu sẽ có các trường giống với tài liệu gốc nhưng trường điểm sẽ là một tài liệu được nhúng liên quan đến phần tử thứ i được trích xuất

Tại thời điểm này, chúng ta có thể tính toán số liệu thống kê về sở thích bằng cách xác định các nhóm sở thích và chỉ định các biện pháp được tính toán. Toán tử để thực hiện thao tác này là $group. Sau đó, chúng tôi thêm một giai đoạn bằng cách nhấp vào nút THÊM GIAI ĐOẠN hoặc trên nút + ở trên cùng bên phải của giai đoạn hiện tại. Như trước đây, chúng ta sẽ chọn toán tử $group và xác định các tham số tương ứng của nó. Trong trường hợp ví dụ, cần phải nhóm theo score_types. Do đó, _id của tài liệu thoát khỏi giai đoạn $group sẽ bằng với giá trị của trường score_type. Để tính điểm trung bình, chúng tôi sẽ xác định một trường mới sẽ được tính bằng toán tử $avg đối với các giá trị có trong điểm số. con đường ghi điểm. Sân khấu sẽ như thế này

{
  _id: "$scores.type",
  avg: {$avg: "$scores.score"}
} 

Rõ ràng các số liệu thống kê khác có thể được trích xuất chẳng hạn như tối thiểu, tối đa và số lượng mục trong mỗi nhóm

{
  _id: "$scores.type",
  avg: {$avg: "$scores.score"},
  min: {$min: "$scores.score"},
  max: {$max: "$scores.score"},
  count: {$sum: 1}
} 

Chú ý

Để đếm số mục trong mỗi nhóm, toán tử $sum phải được sử dụng để tăng bộ đếm lên 1 mỗi lần tài liệu được liên kết với một nhóm. Điều này là do toán tử $count được sử dụng để xác định giai đoạn đếm số lượng tài liệu đến nhận được

Có thể xuất quy trình được xác định bằng một số ngôn ngữ lập trình (Python, Java, Node, C#) hoặc chỉ cần sao chép và sau đó sử dụng nó trong trình bao bằng cách nhấp vào nút

Đếm la bàn MongoDB
. The final result will be as follows:

[{$unwind: {
  path: '$scores'
}}, {$group: {
  _id: '$scores.type',
  avg: {
    $avg: '$scores.score'
  },
  min: {
    $min: '$scores.score'
  },
  max: {
    $max: '$scores.score'
  },
  count: {
    $sum: 1
  }
}}]
 

phân tích lượng tử

Cấu trúc đường dẫn tổng hợp của ví dụ trước có thể được sử dụng bất cứ khi nào cần trích xuất một số thống kê tiêu chuẩn về phân phối dữ liệu. Tuy nhiên, đôi khi cần phải tính lượng tử.  

Trong thống kê và xác suất, lượng tử là các điểm cắt chia phạm vi phân bố xác suất thành các khoảng liên tục có xác suất bằng nhau hoặc chia các quan sát trong một mẫu theo cùng một cách. q-quantiles là các giá trị phân chia một tập hợp hữu hạn các giá trị thành q tập hợp con có kích thước (gần như) bằng nhau. Có q - 1 trong số q-phân vị, một cho mỗi số nguyên k thỏa mãn 0 < k < q

Wikipedia

Có một số lượng tử, được định nghĩa là thứ tự đơn giản, rất phổ biến trong thống kê. Bao gồm các

  • Trung bình. đặt hàng 1/2
  • phần tư. lệnh 1/4, 2/4 và 3/4
  • deciles. đơn hàng m/10
  • phần trăm (hoặc phần trăm). đơn hàng m/100

Tính toán các biện pháp này yêu cầu sắp xếp thứ tự dữ liệu quan tâm và sau đó tính toán chính xác thứ tự của lượng tử tương ứng

Đối với ví dụ này, chúng tôi sẽ sử dụng cơ sở dữ liệu sample_airbnb và tập trung vào tính toán một số phân vị liên quan đến giá. Cụ thể, chúng tôi sẽ tính trung vị, phần tư thứ nhất và thứ tư và phần trăm thứ 95

Bước đầu tiên là sắp xếp dữ liệu trong bộ sưu tập. Chúng ta sẽ sử dụng toán tử $sort. Tương tự như hàm sắp xếp được sử dụng để sắp xếp kết quả tìm kiếm, toán tử $sort yêu cầu một tài liệu được sắp xếp gồm các thuộc tính để thực hiện sắp xếp. Đối với mỗi người trong số họ, bắt buộc phải chèn hướng sắp xếp (1 tăng dần, -1 giảm dần). Trong ví dụ của chúng tôi, chúng tôi sẽ phải sắp xếp trường giá theo thứ tự tăng dần như hình bên dưới

{$sort: {
  price: 1
}} 

Để tiến hành tính toán lượng tử, chúng ta cần nhóm tất cả các giá trị của trường giá thành một vectơ. Bằng cách này, chúng ta có thể khai thác các toán tử tính toán trên vectơ để trích xuất các giá trị của các phân vị quan tâm

Sau đó, chúng tôi cần nhóm tất cả các tài liệu trong bộ sưu tập thành một tài liệu duy nhất sẽ chứa một vectơ giá trị chứa tất cả các giá trị giá được sắp xếp. _id của toán tử $group sẽ được đặt thành null để có được một tài liệu duy nhất đại diện cho toàn bộ bộ sưu tập, trong khi toán tử $push sẽ chèn giá trị của trường giá cho mỗi tài liệu có được từ bước trước đó. Việc sắp xếp theo giá sẽ được giữ nguyên vì các tài liệu sẽ được đọc tuần tự. Giai đoạn nhóm $ sẽ được xác định như sau

{$group: {
  '_id': null, 
  'value': {'$push': '$price'}
}} 

Việc tính toán lượng tử sẽ được thực hiện bởi một số toán tử thao tác véc tơ và toán học. Đặc biệt, chúng ta sẽ sử dụng các toán tử

  • kích thước $
  • $arrayElemAt
  • $nhân lên
  • $sàn

Sử dụng toán tử $size chúng ta sẽ tính kích thước của vector giá trị. Rõ ràng là có thể trích xuất thông tin này trong hoạt động nhóm bằng cách sử dụng toán tử $sum. Kích thước của vectơ sẽ phải được nhân với giá trị của lượng tử quan tâm. Ví dụ: nếu chúng ta muốn tính trung vị, chúng ta sẽ phải nhân nó với 0. 5, cho tứ phân vị đầu tiên bằng 0. 25, v.v.  

Kết quả của phép nhân này sẽ là vị trí trong vectơ mà chúng ta sẽ tìm thấy giá trị của lượng tử. Vì vị trí phải là một số nguyên, nên chúng ta cần đảm bảo rằng giá trị được trả về không chứa bất kỳ số thập phân nào bằng cách sử dụng toán tử $floor. Toán tử này lấy số nguyên lớn nhất nhỏ hơn hoặc bằng số đã chỉ định. Điều này sau đó có thể được trích xuất đến vị trí được tính toán của mảng tương ứng với lượng tử bằng cách sử dụng toán tử $arrayElemAt.   

Những tính toán này sẽ cần được lặp lại cho từng phân vị được tính toán và đặt trong giai đoạn dự án $. Giai đoạn cuối cùng này sẽ trông như sau

{$project: {
  _id: 0,
  "0.25": {
    $arrayElemAt: 
    ["$value", 
    {$floor: {$multiply: [ 0.25, {$size: "$value"} ] } }
    ]
  },
  "median": {
    $arrayElemAt: 
    ["$value", 
    {$floor: {$multiply: [0.5, {$size: "$value"} ] } }
    ]
  },
  "0.75": {
    $arrayElemAt: 
    ["$value", 
    {$floor: {$multiply: [0.75, {$size: "$value"} ] } }
    ]
  },
  "95": {
    $arrayElemAt: 
    ["$value", 
    {$floor: {$multiply: [0.95, {$size: "$value"} ] } }
    ]
  }
} 

phân tích thời gian

MongoDB có thể được sử dụng để lưu trữ dữ liệu chuỗi thời gian. Để có hiệu suất tối đa, cần xác định các mẫu tài liệu giúp giảm thiểu dung lượng ổ đĩa và tối ưu hóa truy cập chuỗi thời gian liên quan đến cùng một đối tượng đo lường. Một cuộc thảo luận sâu hơn về cách lập mô hình tài liệu phù hợp có thể được tìm thấy tại đây

Các lĩnh vực ứng dụng do đó rất nhiều. Chúng bao gồm từ các phép đo cảm biến trong lĩnh vực Internet of Things (IOT) đến theo dõi sự kiện của một hệ thống thông tin. Trong cơ sở dữ liệu mẫu được cung cấp trong MongoDB Atlas, chúng tôi tìm thấy cơ sở dữ liệu sample_weatherdata. Mặc dù cấu trúc tài liệu không phản ánh các hướng lập mô hình chuỗi thời gian, nhưng đây là một ví dụ tuyệt vời để thực hành với khung tổng hợp để trích xuất số liệu thống kê liên quan đến thời gian

Giả sử chúng ta cần trích xuất nhiệt độ tối thiểu và tối đa cho từng khoảng thời gian nếu có hơn 10 lần phát hiện. Trong trường hợp này, ban đầu chúng ta sẽ cần nhóm theo trường ts và tính toán các phép đo quan tâm. Giai đoạn đầu tiên của quy trình tổng hợp sau đó sẽ dẫn đến kết quả.  

{$group: {
  _id: "$ts",
  minTemp: { $min: "$airTemperature.value"},
  maxTemp: { $max: "$airTemperature.value"}
  }
} 

Kết quả của giai đoạn này sẽ là một bộ tài liệu trong đó mỗi tài liệu đại diện cho một thời điểm tức thời với các phép đo nhiệt độ liên quan của nó. Tuy nhiên, số lần đo, tôi. e. , tài liệu, thuộc về mỗi nhóm không được xem xét. Để loại trừ các tài liệu không đáp ứng điều kiện bắt buộc, chúng tôi cần chèn một biện pháp bổ sung trong giai đoạn nhóm $. số lượng các mục thuộc về mỗi nhóm. Để làm điều này, chỉ cần nhập số đo đếm như đã thấy trong ví dụ trước.  

________số 8_______

Việc lọc dựa trên số lượng tài liệu thuộc mỗi nhóm sẽ được thực hiện bằng cách sử dụng toán tử $match.  

{$match: {
    c: {$gt:10}
}} 

Cấu trúc của đường dẫn này rất giống với những gì bạn thực hiện trong các truy vấn SQL khi bạn tạo NHÓM THEO và sau đó bạn chèn toán tử HAVING để lọc kết quả. Không giống như ngôn ngữ SQL nơi bạn có thể sử dụng các hàm tổng hợp (min, max, avg, count, sum) trong các mệnh đề có và chọn, trong MongoDB, bạn phải xác định trong giai đoạn $group tất cả các biện pháp sẽ được sử dụng trong các giai đoạn tiếp theo. Chúng ta phải nhớ rằng đầu ra của mỗi giai đoạn trong quy trình tổng hợp là một bộ tài liệu sẽ đóng vai trò đầu vào cho các giai đoạn tiếp theo

Trong ví dụ vừa thảo luận, giá trị của một trường cụ thể được sử dụng trực tiếp để xác định khoảng thời gian. Điều này là do thực tế phân phối dữ liệu của bộ sưu tập được phân tích. Tuy nhiên, trong nhiều trường hợp, cần phải xác định các khoảng thời gian bắt nguồn từ dấu thời gian được lưu trong tài liệu, chẳng hạn như ngày trong tuần, tháng hoặc thậm chí cả năm. MongoDB cung cấp khả năng dễ dàng trích xuất thông tin này từ dấu thời gian và chèn nó vào đường dẫn tổng hợp. Chúng tôi gần như có thể so sánh thuộc tính này với các quy trình Trích xuất, Chuyển đổi, Tải (ETL) điển hình của kho dữ liệu. Dưới đây là một ví dụ dựa trên bộ sưu tập bán hàng của cơ sở dữ liệu sample_supplies

Giả sử chúng ta muốn tính tổng bộ sưu tập và số lượng mặt hàng đã bán cho mỗi tháng. Bộ sưu tập chứa trong trường saleDate chỉ dấu thời gian liên quan đến thời điểm mua hàng. Do đó, cần phải trích xuất từ ​​trường này thông tin cần thiết để xác định các khoảng một cách thích hợp

Chú ý

Toán tử thời gian chỉ có thể được áp dụng trên các trường loại Ngày, Dấu thời gian và ID đối tượng. Ngoài ra, mỗi toán tử chỉ trích xuất thông tin mà nó đã được xác định. Ví dụ: toán tử $month sẽ trích xuất giá trị số của tháng, trong khi $year sẽ trích xuất năm. Vì vậy, nếu bạn muốn nhóm cho mỗi tháng, bạn phải sử dụng cả tháng và năm. Nếu không các tháng thuộc các năm khác nhau sẽ không được phân biệt

Để sử dụng thông tin tháng và năm trong các phân tích chúng tôi sẽ thực hiện, chúng tôi cần thêm thông tin đó vào từng tài liệu trong bộ sưu tập. Tuy nhiên, không nhất thiết phải thực hiện thao tác cập nhật. Chúng ta có thể sử dụng giai đoạn $addFields để chèn các thuộc tính mới vào từng tài liệu và chỉ cung cấp thay đổi này trong quy trình tổng hợp. Bằng cách này, chúng tôi sẽ không tăng kích thước cơ sở dữ liệu của mình với thông tin có thể được tính toán hiệu quả khi cần, cũng như chúng tôi sẽ không phải sửa đổi các ứng dụng sử dụng cơ sở dữ liệu để xử lý đúng cấu trúc dữ liệu mới. Do đó, giai đoạn đầu tiên sẽ như sau

{
  _id: "$scores.type",
  avg: {$avg: "$scores.score"}
} 
0

Các tài liệu ra khỏi giai đoạn này sẽ có cấu trúc tương tự như bên dưới.  

Đếm la bàn MongoDB

Vì yêu cầu là tính toán một số thống kê bán hàng, nên chúng tôi cần phân tách vectơ mặt hàng. Thao tác này sẽ được thực hiện bằng toán tử $unwind

{
  _id: "$scores.type",
  avg: {$avg: "$scores.score"}
} 
1

Mỗi tài liệu sau đó sẽ đại diện cho việc bán một mặt hàng. Thông tin đã được thêm vào lúc đầu được giữ lại. Sau đó, chúng tôi có thể nhóm tất cả các tài liệu thuộc khoảng thời gian quan tâm

Vì chúng tôi chưa xác định một trường duy nhất bao gồm cả tháng và năm, chúng tôi cần nhập dưới dạng _id của toán tử $group một tài liệu bao gồm cả hai trường. Hoạt động này là hợp pháp và phải được thực hiện bất cứ khi nào các nhóm lợi ích được xác định bằng cách kết hợp các giá trị của các thuộc tính khác nhau

{
  _id: "$scores.type",
  avg: {$avg: "$scores.score"}
} 
2

Các tài liệu kết quả sẽ có cấu trúc sau

Đếm la bàn MongoDB

Bài đọc được đề xuất

PrevPreviousMongoDB Compass – dễ dàng truy vấn và phân tích cơ sở dữ liệu NoSQL

Tiếp theoLý thuyết về bộ bản sao MongoDBTiếp theo

Thêm để khám phá

Đếm la bàn MongoDB

Trí tuệ nhân tạo

DBSCAN. làm thế nào nó hoạt động

Các thuật toán phân cụm cho phép dữ liệu được nhóm theo các đặc điểm vốn có của chúng. Có nhiều thuật toán đã được phát triển qua nhiều năm. Nổi tiếng nhất không thể không kể đến DBSCAN. Hãy cùng tìm hiểu từng bước phương pháp này thành công như thế nào trong việc xác định các cụm dữ liệu có hình dạng và kích thước bất kỳ chỉ nhờ hai tham số

Alessandro Fiori 16 tháng 1 năm 2023

Đếm la bàn MongoDB

nền tảng Elaticsearch

Elaticsearch. đường ống tổng hợp

Elaticsearch cung cấp khả năng trích xuất số liệu thống kê và tập dữ liệu bằng các hàm tổng hợp. Tuy nhiên, trong nhiều ngữ cảnh, cần phải kết hợp kết quả của các phân tích này để thu được kết quả tinh tế hơn. Hãy cho chúng tôi xem làm thế nào các đường ống tổng hợp cho phép chúng tôi có được kết quả mà chúng tôi quan tâm

Làm cách nào để hiển thị số lượng trong MongoDB?

Trả về số lượng tài liệu khớp với truy vấn find() cho bộ sưu tập hoặc chế độ xem. db. bộ sưu tập. phương thức đếm() không thực hiện thao tác find() mà thay vào đó đếm và trả về số lượng kết quả khớp với một truy vấn.

Đếm () trong MongoDB là gì?

Phương thức count() đếm số lượng tài liệu phù hợp với tiêu chí lựa chọn . Nó trả về số lượng tài liệu phù hợp với tiêu chí lựa chọn. Phải mất hai đối số đầu tiên là tiêu chí lựa chọn và đối số còn lại là tùy chọn. Phương pháp này tương đương với db. thu thập.

Làm cách nào để đếm các giá trị riêng biệt trong MongoDB Compass?

Số lượng riêng biệt hoạt động như thế nào. Bằng cách sử dụng cú pháp nêu trên, các trường riêng biệt được truy xuất bằng cách sử dụng phương thức differ() trong khi “. length” sẽ đếm số trường được trả về bởi phương thức differ() . Có một số phiên bản Ubuntu dựa trên MongoDB phải sẵn sàng để tham gia phiên thực hành.

Làm cách nào để đếm trong MongoDB Atlas?

Tùy chọn số lượng Tìm kiếm Atlas thêm một trường vào tài liệu kết quả siêu dữ liệu hiển thị số lượng kết quả tìm kiếm cho truy vấn . Bạn có thể sử dụng số đếm để xác định kích thước của tập hợp kết quả. Bạn có thể sử dụng nó trong giai đoạn $search hoặc $searchMeta.