Разработка схемы данных временных рядов Mongodb - PullRequest
0 голосов
/ 31 января 2020

Читал несколько блогов, связанных с этим топи c, как https://www.mongodb.com/blog/post/time-series-data-and-mongodb-part-1-introduction. Похоже, хранение связанных данных временных рядов в нескольких (или одном документе) было бы лучшим подходом по сравнению с хранением каждой точки данных в виде одного документа. Но я просто думаю, что если хранить его в единственном do c (просто на мгновение забыть о методе определения размера), то это подходит для моего случая использования a) Относительно обновления данных: иногда необходимо заменить весь временной ряд b) Потенциально нужно прочитать отсортированные [<date1,value1>,<date2,value2>,....] по диапазону данных.

Несколько вопросов по моей голове прямо сейчас.

1) Общее предложение, которое я видел, это не вставлять большой массив в один do c, если размер массива равен несвязанный. Если размер массива не связан, mongoDB может потребоваться перераспределить новое пространство при обновлении. Я понимаю, если мы используем старый механизм хранения MMAPv1, это будет проблемой. Но, как я видел из другого ответа в WiredTiger и обновлениях на месте и Обеспечивает ли частичное обновление документа MongoDb в WiredTiger какое-либо преимущество перед полным обновлением документа? , это не Это не проблема, потому что в WiredTiger мы в любом случае создадим все документы и отправим их на диск. И учитывая его оптимизацию для больших документов. Мне просто интересно, если большой массив в одном do c все еще будет проблемой с WiredTiger.

2) [Учитывая, что каждый массив может содержать более 5000 пар ключей-значений, каждая do c составляет около 0,5 - 1 МБ] Похоже, что запрос для извлечения отсортированных временных рядов по диапазону дат будет менее сложным (задействовано меньше конвейеров агрегации, так как мне нужно развернуть вложенный документ для сортировки и фильтрации), если я сохраню каждую точку данных как одну операцию c. Но с точки зрения использования диска и памяти, безусловно, было бы лучше. как я получаю 1 документов против N документов. Поэтому просто думаю, как провести черту здесь с точки зрения производительности.

3) Есть 3 подхода, которые я мог бы go использовать в сценарии A.

  • Заменить все документы (replaceOne / replaceOneModel)
  • Обновить только часть временного ряда do c (updateOne / updateOneModel)
  • Использование массового обновления или вставки для обновления каждого элемента массива

Также я думаю о проблемы перестроения индекса. Поскольку индекс не связан напрямую с файлами данных в WireTiger, кажется, что подход 1 и 2 являются приемлемыми, причем 2 лучше, поскольку он обновляет только целевую часть. Я что-то здесь упускаю?

4) Просто подумайте, что это за сценарий ios, что мы должны на самом деле go для единственной точки данных на подход do c.

Я не слишком знаком с тем, как механизм хранения или сама mongoDB работают под капотом, был бы признателен, если бы кто-то мог пролить свет на это. Заранее спасибо.

...