Hướng dẫn mongodb store historical data - mongodb lưu trữ dữ liệu lịch sử

Giả sử tôi có một người dùng có ID và tôi muốn lưu trữ một bản ghi lịch sử (tài liệu) trên người dùng này mỗi ngày, điều gì tốt hơn:

  • Tạo một tài liệu mới cho mỗi bản ghi và tìm kiếm ID người dùng; hoặc
  • Tiếp tục cập nhật và nhúng dữ liệu đó vào một tài liệu người dùng duy nhất tiếp tục phát triển theo thời gian?

Chủ yếu tôi chỉ muốn truy xuất tài liệu hiện tại cho người dùng nhưng tất cả các bản ghi phải được truy cập bất cứ lúc nào mà không cần tìm kiếm/truy vấn siêu dài.

Hướng dẫn mongodb store historical data - mongodb lưu trữ dữ liệu lịch sử

Hỏi ngày 25 tháng 1 năm 2012 lúc 16:54Jan 25, 2012 at 16:54

2

Có rất nhiều biến số có thể ảnh hưởng đến quyết định như vậy. Một tài liệu lớn dường như rõ ràng nhất với điều kiện nó không phát triển đến kích thước không thực tế hoặc thậm chí không được phép (nhớ bạn, một tài liệu có thể có kích thước tối đa 16MB).

Sử dụng tài liệu trên mỗi mục nhập cũng hoàn toàn khả thi và miễn là bạn tạo các chỉ mục thích hợp sẽ không dẫn đến các truy vấn chậm.

Đã trả lời ngày 25 tháng 1 năm 2012 lúc 17:02Jan 25, 2012 at 17:02

Remon van vlietremon van vlietRemon van Vliet

18.1k3 Huy hiệu vàng50 Huy hiệu bạc56 Huy hiệu Đồng3 gold badges50 silver badges56 bronze badges

Có một giới hạn cho việc một tài liệu có thể lớn như thế nào. Đó là (như V1.8) 16 MB. Vì vậy, bạn có thể chỉ cần hết phòng nếu bạn cập nhật và nhúng. Ngoài ra, Mongo phân bổ không gian tài liệu dựa trên kích thước tài liệu trung bình trong một bộ sưu tập. Nếu bạn tiếp tục điều chỉnh/thay đổi kích thước này có thể có ý nghĩa hiệu suất tiêu cực.

Tôi nghĩ rằng sẽ an toàn hơn nhiều khi tạo tài liệu mới cho mỗi bản ghi và nếu/khi bạn muốn đối chiếu dữ liệu đó, bạn sẽ thực hiện nó trong bản đồ/giảm công việc.

Đã trả lời ngày 25 tháng 1 năm 2012 lúc 17:00Jan 25, 2012 at 17:00

Mark Bolusmjakmark BolusmjakMark Bolusmjak

23.1K10 Huy hiệu vàng72 Huy hiệu bạc123 Huy hiệu đồng10 gold badges72 silver badges123 bronze badges

2

MongoDB cho phép bạn lưu trữ và xử lý dữ liệu chuỗi thời gian ở quy mô. Tìm hiểu cách lưu trữ và phân tích dữ liệu chuỗi thời gian của bạn bằng cụm MongoDB.

Dữ liệu chuỗi thời gian được tạo ra ở khắp mọi nơi từ phương tiện truyền thông xã hội đến đánh dấu vào các thiết bị IoT. Phân tích dữ liệu chuỗi thời gian cho phép các tổ chức phát hiện, ngăn chặn và dự đoán các sự kiện trước đối thủ của họ. Nhưng khối lượng dữ liệu chuỗi thời gian ngày càng tăng nên được lưu trữ ở đâu? Và làm thế nào nó có thể được phân tích?

MongoDB đã thêm hỗ trợ gốc cho dữ liệu chuỗi thời gian trong phiên bản 5.0. Trong bài viết này, bạn sẽ tìm hiểu dữ liệu chuỗi thời gian nào, cách bạn có thể lưu trữ và truy vấn dữ liệu chuỗi thời gian trong MongoDB và thực tiễn tốt nhất là gì để làm việc với dữ liệu chuỗi thời gian trong MongoDB.

Dữ liệu chuỗi thời gian là gì?

Dữ liệu chuỗi thời gian là các phép đo được thực hiện tại các khoảng thời gian từ một hoặc nhiều nguồn.

Mặc dù không phải tất cả dữ liệu là chuỗi thời gian trong tự nhiên, tỷ lệ ngày càng tăng của nó có thể được phân loại là chuỗi thời gian. Gần như mọi công ty cần truy vấn, phân tích và báo cáo về dữ liệu chuỗi thời gian. Hãy xem xét một nhà giao dịch ngày chứng khoán liên tục xem xét các nguồn cấp dữ liệu của giá cổ phiếu theo thời gian và các thuật toán chạy để phân tích xu hướng để xác định các cơ hội. Họ đang xem xét dữ liệu trong một khoảng thời gian với phạm vi hàng giờ hoặc hàng ngày. Một ví dụ khác có thể là làm thế nào một thiết bị đo thời tiết được kết nối có thể thu được từ xa như mức độ ẩm và thay đổi nhiệt độ để dự báo thời tiết. Ngoài ra, nó có thể theo dõi ô nhiễm không khí để đưa ra cảnh báo hoặc phân tích trước khi khủng hoảng xảy ra. Thông tin thu thập có thể được xem xét trong khoảng thời gian để tính toán xu hướng theo thời gian.

Dưới đây là một ví dụ tài liệu duy nhất về đo lường giao dịch chứng khoán:

{
    date: ISODate("2020-01-03T05:00:00.000Z"),
    symbol: 'AAPL',
    volume: 146322800,
    open: 74.287498,
    adjClose: 73.486023,
    high: 75.144997,
    low: 74.125,
    close: 74.357498
  }

Nói chung, dữ liệu chuỗi thời gian bao gồm thời gian và phép đo, cũng như các thông tin nhận dạng khác như nguồn dữ liệu. Trong ví dụ này về dữ liệu chuỗi thời gian nắm bắt thông tin giao dịch chứng khoán, chúng tôi có ngày là phân loại thời gian và biểu tượng cổ phiếu là trường nhận dạng trong khi thông tin như giá mở và đóng là các phép đo trong trường hợp này.date as the time classifier and the stock symbol as the identification field while information like open and close prices are the measurements in this case.

Dữ liệu chuỗi thời gian trong MongoDB

Khi bạn làm việc với dữ liệu chuỗi thời gian, bạn thường không chỉ quan tâm đến việc lưu trữ dữ liệu mà còn yêu cầu hiệu suất đọc và ghi cao và khả năng truy vấn nâng cao. MongoDB là cơ sở dữ liệu mục đích chung dựa trên tài liệu với thiết kế lược đồ linh hoạt và ngôn ngữ truy vấn phong phú. Kể từ MongoDB 5.0, MongoDB tự nhiên hỗ trợ dữ liệu chuỗi thời gian.

Bạn có thể tạo một bộ sưu tập chuỗi thời gian mới với lệnh

db.createCollection("dowJonesTickerData", 
{ timeseries: { 
               timeField: "date", 
               metaField: "symbol",
               granularity: "minutes" } })
6. Khi bạn muốn tạo một bộ sưu tập chuỗi thời gian, bạn phải bao gồm tùy chọn
db.createCollection("dowJonesTickerData", 
{ timeseries: { 
               timeField: "date", 
               metaField: "symbol",
               granularity: "minutes" } })
7.
db.createCollection("dowJonesTickerData", 
{ timeseries: { 
               timeField: "date", 
               metaField: "symbol",
               granularity: "minutes" } })
7 chỉ ra tên của trường bao gồm ngày trong mỗi tài liệu. Bạn cũng nên bao gồm các tùy chọn sau:

  • db.createCollection("dowJonesTickerData", 
    { timeseries: { 
                   timeField: "date", 
                   metaField: "symbol",
                   granularity: "minutes" } })
    9 chỉ ra tên của trường chứa siêu dữ liệu trong mỗi tài liệu. Metafield phục vụ như một nhãn hoặc thẻ cho phép các bộ sưu tập chuỗi thời gian xác định duy nhất nguồn gốc của chuỗi thời gian. Trường này không bao giờ nên hoặc hiếm khi thay đổi theo thời gian.
  • Trường
    db.dowJonesTickerData.insertOne({
        date: ISODate("2020-01-03T05:00:00.000Z"),
        symbol: 'AAPL',
        volume: 146322800,
        open: 74.287498,
        adjClose: 73.486023,
        high: 75.144997,
        low: 74.125,
        close: 74.357498
      })
    0 cho biết khoảng thời gian giữa các tài liệu có metafield phù hợp, nếu được chỉ định. Độ chi tiết mặc định là
    db.dowJonesTickerData.insertOne({
        date: ISODate("2020-01-03T05:00:00.000Z"),
        symbol: 'AAPL',
        volume: 146322800,
        open: 74.287498,
        adjClose: 73.486023,
        high: 75.144997,
        low: 74.125,
        close: 74.357498
      })
    1Which cho thấy tỷ lệ ăn tần số cao vì nó liên quan đến từng chuỗi thời gian duy nhất được xác định bởi metafield. Độ chi tiết có thể được đặt thành
    db.dowJonesTickerData.insertOne({
        date: ISODate("2020-01-03T05:00:00.000Z"),
        symbol: 'AAPL',
        volume: 146322800,
        open: 74.287498,
        adjClose: 73.486023,
        high: 75.144997,
        low: 74.125,
        close: 74.357498
      })
    2
    db.dowJonesTickerData.insertOne({
        date: ISODate("2020-01-03T05:00:00.000Z"),
        symbol: 'AAPL',
        volume: 146322800,
        open: 74.287498,
        adjClose: 73.486023,
        high: 75.144997,
        low: 74.125,
        close: 74.357498
      })
    3 hoặc
    db.dowJonesTickerData.insertOne({
        date: ISODate("2020-01-03T05:00:00.000Z"),
        symbol: 'AAPL',
        volume: 146322800,
        open: 74.287498,
        adjClose: 73.486023,
        high: 75.144997,
        low: 74.125,
        close: 74.357498
      })
    4 và có thể được sửa đổi để thô hơn bất cứ lúc nào. Tuy nhiên, bạn không thể sửa đổi mức độ chi tiết thành mịn hơn, ví dụ: "phút" thành "giây", do đó nên bắt đầu ở mức độ chi tiết mịn hơn và điều chỉnh theo độ chi tiết thô hơn.

Cuối cùng, bạn có thể muốn bao gồm tùy chọn này nếu bạn muốn xóa dữ liệu sau một thời gian nhất định đã trôi qua:

  • Trường
    db.dowJonesTickerData.insertOne({
        date: ISODate("2020-01-03T05:00:00.000Z"),
        symbol: 'AAPL',
        volume: 146322800,
        open: 74.287498,
        adjClose: 73.486023,
        high: 75.144997,
        low: 74.125,
        close: 74.357498
      })
    5 cho biết số giây sau đó các tài liệu sẽ hết hạn và tự động bị xóa.

Ví dụ sau đây tạo ra một bộ sưu tập chuỗi thời gian có tên

db.dowJonesTickerData.insertOne({
    date: ISODate("2020-01-03T05:00:00.000Z"),
    symbol: 'AAPL',
    volume: 146322800,
    open: 74.287498,
    adjClose: 73.486023,
    high: 75.144997,
    low: 74.125,
    close: 74.357498
  })
6 trong đó
db.createCollection("dowJonesTickerData", 
{ timeseries: { 
               timeField: "date", 
               metaField: "symbol",
               granularity: "minutes" } })
7 là ngày và
db.createCollection("dowJonesTickerData", 
{ timeseries: { 
               timeField: "date", 
               metaField: "symbol",
               granularity: "minutes" } })
9 là ký hiệu:date and the
db.createCollection("dowJonesTickerData", 
{ timeseries: { 
               timeField: "date", 
               metaField: "symbol",
               granularity: "minutes" } })
9 is symbol:

db.createCollection("dowJonesTickerData", 
{ timeseries: { 
               timeField: "date", 
               metaField: "symbol",
               granularity: "minutes" } })

Mỗi tài liệu mà bạn thêm vào bộ sưu tập chuỗi thời gian sẽ cần chỉ định ít nhất là

db.createCollection("dowJonesTickerData", 
{ timeseries: { 
               timeField: "date", 
               metaField: "symbol",
               granularity: "minutes" } })
7. Trong tài liệu ví dụ dưới đây,
db.createCollection("dowJonesTickerData", 
{ timeseries: { 
               timeField: "date", 
               metaField: "symbol",
               granularity: "minutes" } })
7 là
db.dowJonesTickerData.findOne()
1. Lưu ý rằng,
db.createCollection("dowJonesTickerData", 
{ timeseries: { 
               timeField: "date", 
               metaField: "symbol",
               granularity: "minutes" } })
7 có thể được đặt tên bất cứ thứ gì miễn là nó thuộc loại BSON, ngày. Một tài liệu có thể được thêm vào một bộ sưu tập chuỗi thời gian bằng cách sử dụng bất kỳ phương pháp nào có thể được sử dụng để chèn tài liệu vào các bộ sưu tập MongoDB khác. Ví dụ dưới đây thêm một tài liệu vào bộ sưu tập
db.dowJonesTickerData.insertOne({
    date: ISODate("2020-01-03T05:00:00.000Z"),
    symbol: 'AAPL',
    volume: 146322800,
    open: 74.287498,
    adjClose: 73.486023,
    high: 75.144997,
    low: 74.125,
    close: 74.357498
  })
6 bằng
db.dowJonesTickerData.findOne()
4.

db.dowJonesTickerData.insertOne({
    date: ISODate("2020-01-03T05:00:00.000Z"),
    symbol: 'AAPL',
    volume: 146322800,
    open: 74.287498,
    adjClose: 73.486023,
    high: 75.144997,
    low: 74.125,
    close: 74.357498
  })

Mỗi phép đo được chèn phải là một phép đo duy nhất, như các tài liệu riêng lẻ hoặc lô tài liệu với một phép đo cho mỗi tài liệu. MongoDB sẽ tối ưu hóa dữ liệu này được lưu trữ theo thời gian để giảm dấu chân kích thước và tối ưu hóa các mẫu truy cập chuỗi thời gian và thông lượng ghi.

Làm cách nào để lấy dữ liệu chuỗi thời gian trong MongoDB?

Các tài liệu trong các bộ sưu tập chuỗi thời gian có thể được truy vấn theo cùng một cách tài liệu trong các bộ sưu tập MongoDB khác có thể. Ví dụ: chúng ta có thể truy vấn trong vỏ MongoDB, Mongosh, cho một tài liệu trong bộ sưu tập

db.dowJonesTickerData.insertOne({
    date: ISODate("2020-01-03T05:00:00.000Z"),
    symbol: 'AAPL',
    volume: 146322800,
    open: 74.287498,
    adjClose: 73.486023,
    high: 75.144997,
    low: 74.125,
    close: 74.357498
  })
6 bằng cách sử dụng
db.dowJonesTickerData.findOne()
6.

db.dowJonesTickerData.findOne()

Vỏ MongoDB sẽ trả về một tài liệu:

{
    date: ISODate("2020-01-03T05:00:00.000Z"),
    symbol: 'AAPL',
    volume: 146322800,
    open: 74.287498,
    adjClose: 73.486023,
    high: 75.144997,
    low: 74.125,
    close: 74.357498,
    _id: ObjectId("60eea26373c4cdcb6356827d")
  }

MongoDB tối ưu hóa dữ liệu, vì nó lưu trữ dữ liệu được đặt hàng theo thời gian trái ngược với trật tự tự nhiên trong các bộ sưu tập thông thường.

Bạn có thể cải thiện hiệu suất truy vấn bằng cách thêm các chỉ mục thứ cấp trên metafield và/hoặc timefield.

db.dowJonesTickerData.createIndex({ symbol : 1, date : 1});

Nếu bạn muốn kích hoạt tìm kiếm trên nhiều trường siêu dữ liệu (ví dụ: ký hiệu và công ty), chúng tôi khuyên bạn nên cập nhật mô hình dữ liệu của bạn. Thay vì metafield là một giá trị duy nhất (ví dụ: ký hiệu), hãy cập nhật metafield thành một đối tượng chứa nhiều mảnh siêu dữ liệu.

Ví dụ: hãy bỏ bộ sưu tập

db.dowJonesTickerData.insertOne({
    date: ISODate("2020-01-03T05:00:00.000Z"),
    symbol: 'AAPL',
    volume: 146322800,
    open: 74.287498,
    adjClose: 73.486023,
    high: 75.144997,
    low: 74.125,
    close: 74.357498
  })
6 hiện tại của chúng tôi và tạo một bộ sưu tập mới có
db.createCollection("dowJonesTickerData", 
{ timeseries: { 
               timeField: "date", 
               metaField: "symbol",
               granularity: "minutes" } })
9 có tên là "Meta".

db.dowJonesTickerData.drop();

db.createCollection("dowJonesTickerData", 
{ timeseries: { 
               timeField: "date", 
               metaField: "meta",
               granularity: "minutes" } })

Tiếp theo, hãy chèn một tài liệu lưu trữ nhiều mảng siêu dữ liệu trong trường

db.dowJonesTickerData.findOne()
9.

db.dowJonesTickerData.insertOne({
  date: ISODate("2021-05-20T10:24:51.303Z"),
  meta : { symbol: 'ba', company: 'boeing'},
  price: 125
})

Bây giờ, chúng ta có thể tạo một chỉ mục thứ cấp có nhiều trường. Trong trường hợp của chúng tôi, chúng tôi sẽ tạo một chỉ mục thứ cấp cho phép tìm kiếm hiệu quả cả

{
    date: ISODate("2020-01-03T05:00:00.000Z"),
    symbol: 'AAPL',
    volume: 146322800,
    open: 74.287498,
    adjClose: 73.486023,
    high: 75.144997,
    low: 74.125,
    close: 74.357498,
    _id: ObjectId("60eea26373c4cdcb6356827d")
  }
0 và
{
    date: ISODate("2020-01-03T05:00:00.000Z"),
    symbol: 'AAPL',
    volume: 146322800,
    open: 74.287498,
    adjClose: 73.486023,
    high: 75.144997,
    low: 74.125,
    close: 74.357498,
    _id: ObjectId("60eea26373c4cdcb6356827d")
  }
1.


db.dowJonesTickerData.createIndex({ "meta.symbol" :1, "meta.company" :1 , date : 1});

Dọn dẹp tài liệu

Thông thường dữ liệu chuỗi thời gian có thể không liên quan sau một khoảng thời gian nhất định. Thanh lọc hoặc lưu trữ dữ liệu cũ giúp việc thu thập càng nhỏ càng tốt, do đó cải thiện hiệu suất và giảm chi phí.

Tự động xóa tài liệu chuỗi thời gian

Cách được đề xuất để tự động xóa dữ liệu đã hết hạn là đặt TTL, thời gian để biểu thức trực tiếp, trên một bộ sưu tập chuỗi thời gian dưới dạng tham số hết hạn. Dữ liệu sẽ bị xóa sau khi giá trị ngày tài liệu đạt đến ngay bây giờ - hết hạn.

db.createCollection("dowJonesTickerData", 
{ timeseries: { 
               timeField: "date", 
               metaField: "meta" ,
               granularity : "minutes"
               },
expireAfterSeconds : 94608000 // 3 years 
})

Trong ví dụ trên, một tài liệu sẽ bị xóa sau khi giá trị được lưu trữ trong trường ngày là ba năm.

Bạn có thể đặt hoặc sửa đổi tham số này tại bất kỳ điểm nào trong hoặc sau khi tạo thu thập, vì vậy nếu các yêu cầu của bạn thay đổi xung quanh vòng đời dữ liệu của bạn, bạn có thể dễ dàng sửa đổi hoặc cập nhật thời gian để sống cho dữ liệu của mình.

Tự động lưu trữ tài liệu chuỗi thời gian

Một tùy chọn khác để xử lý dữ liệu cũ là xếp nó vào lưu trữ lưu trữ trực tuyến và vận hành. Bạn có thể sử dụng lưu trữ Atlas Online để tự động lưu trữ dữ liệu từ cụm Atlas của bạn đến hồ dữ liệu do MongoDB quản lý.
You can use Atlas Online Archive to automatically archive data from your Atlas cluster to a MongoDB-managed Data Lake.

Lưu trữ trực tuyến có nhiều lợi thế:

  • Tách dữ liệu nóng được giữ lại trong cơ sở dữ liệu cụm Atlas hoạt động và dữ liệu lưu trữ lạnh được duy trì trong kho lưu trữ lưu trữ trực tuyến
  • Tối ưu hóa chi phí trong khi vẫn giữ một bộ dữ liệu lớn đáng kể cho các mục đích khác nhau, ví dụ: mục đích tuân thủ và lịch sử
  • Hiệu suất lưu trữ và truy vấn tối đa cho dữ liệu chuỗi thời gian lưu trữ thông qua lưu trữ của MongoDB Atlas Atlas Online *
  • Các truy vấn được liên kết cho phép các nhà phát triển truy vấn cả dữ liệu nóng trong cụm Atlas và dữ liệu lạnh trong kho lưu trữ trực tuyến cùng nhau, cho phép bạn kết hợp dữ liệu lịch sử với dữ liệu mới.

Hướng dẫn mongodb store historical data - mongodb lưu trữ dữ liệu lịch sử

Xem tài liệu MongoDB chính thức về cấu hình Lưu trữ trực tuyến để biết thêm thông tin.

Phân tích dữ liệu chuỗi thời gian trong MongoDB

MongoDB cung cấp một loạt các nhà khai thác đường ống tổng hợp và các giai đoạn đường ống tổng hợp để cho phép các nhà phát triển phân tích dữ liệu. Các nhà khai thác và giai đoạn này có sẵn cho tất cả các bộ sưu tập - chuỗi thời gian hoặc thường xuyên. Hãy xem xét một số nhà khai thác mới và một giai đoạn được thêm vào phiên bản 5.0 để giúp việc làm với ngày và thời gian dễ dàng hơn.

Các nhà khai thác đường ống tổng hợp mới: $ dateadd, $ datediff và $ datetrunc

Trong phiên bản 5.0, MongoDB đã thêm các nhà khai thác đường ống tổng hợp này:

  • $ dateadd: Thêm một lượng thời gian xác định vào đối tượng ngày
  • $ datediff: Trả về chênh lệch thời gian giữa hai ngày
  • $ datetrunc: Trả về một ngày đã bị cắt ngắn thành đơn vị được chỉ định

Các nhà khai thác mới làm việc với dữ liệu chuỗi thời gian thậm chí dễ dàng hơn. Ghé thăm tài liệu chính thức của MongoDB về các nhà khai thác đường ống tổng hợp để tìm hiểu thêm về tất cả các nhà khai thác có sẵn.

$ datetrunc ví dụ

Xem xét ví dụ về dữ liệu chứng khoán gốc:

{
    date: ISODate("2020-01-03T05:00:00.000Z"),
    symbol: 'AAPL',
    volume: 146322800,
    open: 74.287498,
    adjClose: 73.486023,
    high: 75.144997,
    low: 74.125,
    close: 74.357498
  }

Đối với ví dụ này, bộ sưu tập

db.dowJonesTickerData.insertOne({
    date: ISODate("2020-01-03T05:00:00.000Z"),
    symbol: 'AAPL',
    volume: 146322800,
    open: 74.287498,
    adjClose: 73.486023,
    high: 75.144997,
    low: 74.125,
    close: 74.357498
  })
6 đang sử dụng ngày Date Date như một biểu tượng và biểu tượng thời gian và là một metafield.

Giả sử chúng tôi muốn tính giá cổ phiếu đóng cửa trung bình mỗi tháng cho mỗi cổ phiếu trong bộ sưu tập. Chúng ta có thể sử dụng

{
    date: ISODate("2020-01-03T05:00:00.000Z"),
    symbol: 'AAPL',
    volume: 146322800,
    open: 74.287498,
    adjClose: 73.486023,
    high: 75.144997,
    low: 74.125,
    close: 74.357498,
    _id: ObjectId("60eea26373c4cdcb6356827d")
  }
3 để cắt ngắn ngày thành tháng thích hợp. Sau đó, chúng ta có thể sử dụng
{
    date: ISODate("2020-01-03T05:00:00.000Z"),
    symbol: 'AAPL',
    volume: 146322800,
    open: 74.287498,
    adjClose: 73.486023,
    high: 75.144997,
    low: 74.125,
    close: 74.357498,
    _id: ObjectId("60eea26373c4cdcb6356827d")
  }
4 để đầu tiên, nhóm các tài liệu theo tháng và biểu tượng và thứ hai, tính toán trung bình cho mỗi nhóm.

db.createCollection("dowJonesTickerData", 
{ timeseries: { 
               timeField: "date", 
               metaField: "symbol",
               granularity: "minutes" } })
1

Kết quả của việc chạy tập hợp trên là một tập hợp các tài liệu. Mỗi tài liệu chứa giá đóng cửa trung bình mỗi tháng cho một cổ phiếu cụ thể. Dưới đây là các tài liệu ví dụ xuất phát từ việc chạy tập hợp trên.

db.createCollection("dowJonesTickerData", 
{ timeseries: { 
               timeField: "date", 
               metaField: "symbol",
               granularity: "minutes" } })
2

Chức năng cửa sổ với giai đoạn đường ống tổng hợp mới: $ setwindowfields

Các chức năng cửa sổ cho phép các nhà phát triển chạy tính toán trên các tài liệu trong một cửa sổ nhất định. MongoDB đã thêm hỗ trợ cho các chức năng cửa sổ trong phiên bản 5.0 với việc giới thiệu giai đoạn đường ống tổng hợp $ setWindowFields. Tương tự như $ Group, $ setWindowFields cho phép bạn áp dụng một hoặc nhiều thao tác trên cửa sổ được xác định. Trong $ Group, các tài liệu được nhóm lại với nhau và sau đó tính toán được thực hiện trên mỗi nhóm. Trong $ setWindowFields, các cửa sổ liên quan đến từng tài liệu, do đó các tính toán được thực hiện trên mỗi tài liệu.

Với nhà điều hành $ setWindowFields mới, bạn có thể tính trung bình cuộn của giá đóng cửa trong 30 ngày qua cho mỗi cổ phiếu:

db.createCollection("dowJonesTickerData", 
{ timeseries: { 
               timeField: "date", 
               metaField: "symbol",
               granularity: "minutes" } })
3

Kết quả của việc chạy tập hợp trên là một tập hợp các tài liệu. Bộ sẽ chứa cùng số lượng tài liệu như bộ sưu tập ban đầu. Mỗi tài liệu trong kết quả sẽ chứa một trường mới:

{
    date: ISODate("2020-01-03T05:00:00.000Z"),
    symbol: 'AAPL',
    volume: 146322800,
    open: 74.287498,
    adjClose: 73.486023,
    high: 75.144997,
    low: 74.125,
    close: 74.357498,
    _id: ObjectId("60eea26373c4cdcb6356827d")
  }
5. Giá trị của
{
    date: ISODate("2020-01-03T05:00:00.000Z"),
    symbol: 'AAPL',
    volume: 146322800,
    open: 74.287498,
    adjClose: 73.486023,
    high: 75.144997,
    low: 74.125,
    close: 74.357498,
    _id: ObjectId("60eea26373c4cdcb6356827d")
  }
5 là trung bình của giá đóng cửa của tháng trước cho biểu tượng cổ phiếu được chỉ định. Dưới đây là một tài liệu ví dụ dẫn đến việc chạy tập hợp trên.

db.createCollection("dowJonesTickerData", 
{ timeseries: { 
               timeField: "date", 
               metaField: "symbol",
               granularity: "minutes" } })
4

Biểu đồ MongoDB là một công cụ tuyệt vời để trực quan hóa dữ liệu được tính toán bởi đường ống tổng hợp trên.

Điều chỉnh nguồn dữ liệu biểu đồ để sử dụng cùng một đường ống mà chúng tôi đã làm ở trên:

db.createCollection("dowJonesTickerData", 
{ timeseries: { 
               timeField: "date", 
               metaField: "symbol",
               granularity: "minutes" } })
5

Hướng dẫn mongodb store historical data - mongodb lưu trữ dữ liệu lịch sử

Do đó, nguồn dữ liệu hiển thị tất cả các trường như biểu tượng, ngày, đóng và Averagemonthclosesprice, có thể được sử dụng trực tiếp trong biểu đồ dòng:

Hướng dẫn mongodb store historical data - mongodb lưu trữ dữ liệu lịch sử

Khi biểu đồ dữ liệu này, chúng ta có thể thấy giá trị ngay lập tức của phân tích này:

Hướng dẫn mongodb store historical data - mongodb lưu trữ dữ liệu lịch sử

Các biểu đồ trên cho thấy giá đóng cửa và biểu đồ trung bình 30 ngày của mỗi cổ phiếu.

Thực tiễn tốt nhất để lưu trữ dữ liệu chuỗi thời gian trong MongoDB

Dưới đây là danh sách sáu thực tiễn tốt nhất để làm việc với dữ liệu chuỗi thời gian trong MongoDB:

  • Sử dụng bộ sưu tập chuỗi thời gian với dữ liệu chuỗi thời gian khi có thể.
  • Khi sử dụng bộ sưu tập chuỗi thời gian, lưu trữ các phép đo hoặc nhóm đo riêng lẻ như một tài liệu được chèn theo lô.
  • Điều chỉnh dữ liệu của bạn để có metafield và timefield thích hợp xem xét các đặc điểm dữ liệu và mẫu truy vấn.
  • Điều chỉnh độ chi tiết dữ liệu của bạn theo tỷ lệ nhập dữ liệu của bạn vì nó liên quan đến tính toán của metafield của bạn hoặc các kết hợp độc đáo của metafield duy nhất của bạn. Ví dụ: nếu metafield của bạn là khách hàng, nhưng bạn chỉ nhận được dữ liệu từ một khách hàng duy nhất cứ sau năm phút, bạn nên thay đổi độ chi tiết của mình thành vài phút, mặc dù có khả năng nhận được 10ks chèn mỗi phút tổng thể. Tấm gai dữ liệu cho các giá trị metafield của bạn là tốt. Điều này không cần phải thống nhất, nhưng nên là một xấp xỉ tốt nhất có thể.
  • Xác minh rằng bạn biết về các hạn chế hiện tại với các bộ sưu tập chuỗi thời gian.

Bản tóm tắt

Dữ liệu chuỗi thời gian ở khắp mọi nơi, nhưng lưu trữ và truy vấn nó có thể là thách thức.MongoDB đã thêm hỗ trợ gốc cho dữ liệu chuỗi thời gian trong phiên bản 5.0, giúp nó thậm chí còn dễ dàng hơn, nhanh hơn và rẻ hơn để làm việc với dữ liệu chuỗi thời gian.

Hãy thử miễn phí cho chính mình.

Bắt đầu làm việc với dữ liệu chuỗi thời gian trong MongoDB Atlas.

Câu hỏi thường gặp

Dữ liệu chuỗi thời gian là gì?

MongoDB có phải là cơ sở dữ liệu chuỗi thời gian không?

Làm cách nào để lưu trữ và cập nhật dữ liệu chuỗi thời gian trong MongoDB?

Các bộ sưu tập thời gian chỉ có sẵn trong Atlas?

Làm thế nào để bạn sử dụng dữ liệu chuỗi thời gian?