Я хочу проверить разные условия в MongoDB - PullRequest
1 голос
/ 17 апреля 2020

Я хочу проверить условие в пн go БД.

Если в записи базы данных существует "availability_detail.daily_schedule", то я хочу проверить на "availability_detail.daily_schedule.start_time": { $lte: add_time }, в противном случае я хочу проверить его на "availability_detail.daily_schedule.start_time": { $lte: "00:00" }

В дБ моя запись сохраняется следующим образом:

"availability_detail" : {
    "daily_schedule" : {
      "start_time" : "03:00",
      "end_time" : "04:00"
    },
    "on_days" : [ 
        "Monday", 
        "Tuesday", 
        "Wednesday", 
        "Thursday", 
        "Friday", 
        "Saturday", 
        "Sunday"
    ],
}

ИЛИ

"availability_detail" : {
    // Here, the daily_schedule does not exist
    "on_days" : [ 
        "Monday", 
        "Tuesday", 
        "Wednesday", 
        "Thursday", 
        "Friday", 
        "Saturday", 
        "Sunday"
    ],
}

Может кто-нибудь помочь мне добиться этого? Я новичок в mongoDb, и я не мог найти никакого решения для этого.

1 Ответ

0 голосов
/ 18 апреля 2020

Нет прямой функции, которая могла бы сделать это в MongoDB, вызвать проблему с вашей схемой. Как правило, вы можете сделать это: "availability_detail.daily_schedule.start_time": { $eq: "00:00" }, но не это "availability_detail.daily_schedule.start_time": { $lte: "00:00" }, чтобы можно было выполнить сравнение строк со строками "00:00" == "00:00" или "00:00" !== "00:00", но когда дело касается операторов больше или меньше "00:00" >= "00:00" или "00:00" =< "00:00", они плохо работают в базе данных, поэтому лучше всего сохранять их как документы типа Int в документах.

Поскольку вы уже сохранили данные в формате "00:00", вам необходимо преобразовать их в целые числа, например 0, используя конвейер агрегации и сравнить с целочисленным вводом.

Запрос 1:

db.collection.aggregate([
    {
      $match: {
        $or: [{"availability_detail.daily_schedule": {$exists: false}},
          {
            $expr: {
              $lte: [ 
                 {$toInt: 
                   {
                    $concat: [
                      {$substr: [ "$availability_detail.daily_schedule.start_time",0,2]},
                      {$substr: [ "$availability_detail.daily_schedule.start_time",3,4]}
                     ] 
                   }
                 },
                0 /** Input 0 for "00:00" or 310 for "03:10" or 1830 for "18:30" */
              ]
            }
          }
        ]
      }
    }
  ])

Тест: mongoplayground

Запрос 2:

db.collection.aggregate([
    {
      $match: {
        $or: [{"availability_detail.daily_schedule": {$exists: false}},
        {
            $expr: {
              $lte: [
                {
                  $toInt: {
                    $concat: [
                      {
                        $arrayElemAt: [{$split: ["$availability_detail.daily_schedule.start_time",":"]},0]
                      },
                      {
                        $arrayElemAt: [{$split: ["$availability_detail.daily_schedule.start_time",":"]},1]
                      }
                    ]
                  }
                },
                0 /** Input 0 for "00:00" or 310 for "03:10" or 1830 for "18:30" */
              ]
            }
          }
        ]
      }
    }
  ])

Тест: mongoplayground

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...