Как сохранить период времени в MongoDB - PullRequest
1 голос
/ 17 апреля 2020

Как эффективно хранить период времени?

Первый подход:


{
   "workingDayStartAt: "9:00",
   "workingDayEndAt: "18:00"
}

Второй подход:


{
   "workingDay": "9:00 - 18:00"
}

При первом подходе у меня есть дополнительное поле в дБ. Во втором я должен разобрать «workingDay» (начало, конец) на стороне клиента.

1 Ответ

1 голос
/ 17 апреля 2020

Вы можете рассмотреть несколько вещей:

  1. Я бы сказал, не хранить период времени в формате String, потому что запрос может быть сложным, скажем, когда вы запрашиваете документы с workingDayStartAt при 10:00 am и workingDayEndAt при 12:00 pm это было бы невозможно при втором подходе, так как передача этих значений и сопоставление со строкой не легки. Так что нет Второй .

  2. Так как вы остались с Первый подход { "workingDayStartAt: "9:00", "workingDayEndAt: "18:00" }. Но у меня есть несколько предложений:

    a) Не храните числа в виде строк в базе данных, всегда храните числа в виде целых чисел в MongoDB, что очень вам помогает при выполнении запросов. Дополнительное числовое поле с индексом не требует больших затрат по сравнению со сравнением строк при выполнении запросов (Это может быть проблемой, если ваш do c слишком большой / слишком много индексов или размер коллекции слишком большой - в общем / большинстве случаев это не так вопрос).

    б) А вы, что если в будущем у вас будут разные периоды времени для разных дней в неделе? - Так что, если это может произойти, вам нужно хранить данные в течение дня, у вас может быть что-то вроде ниже:

Поле timePeriods:

{
  timePeriods : { /** This can be an array of objects as well */
  "0": [{ workingDayStartAt:  900, workingDayEndAt: 1800 }], /** Instead of array it can be an object */
  "1": [{ workingDayStartAt: 1000, workingDayEndAt: 1800 }],
  "2": [{ workingDayStartAt: 1100, workingDayEndAt: 1800 }],
  "3": [{ workingDayStartAt: 1130, workingDayEndAt: 1800 }],
  "4": [{ workingDayStartAt:  930, workingDayEndAt: 1800 }],
  "5": [{ workingDayStartAt: 1000, workingDayEndAt: 1800 }],
  "6": [{ workingDayStartAt: 1200, workingDayEndAt: 1800 }],
  }
}

/** Just in case if you've two different start & end hours on same day */
"0": [{ workingDayStartAt: 0900, workingDayEndAt: 1100 }, { workingDayStartAt: 1300, workingDayEndAt: 1800 } ]

/** Or if you've same times everyday 
 * (You can just say `'0_7': {exists : true}` to check if all days have same times & check for docs with particular times)*/
 {
    timePeriods : {
         "0_7": [{ workingDayStartAt: 900, workingDayEndAt: 1800 }]
      }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...