Как получить записи на основе времени? - PullRequest
0 голосов
/ 06 сентября 2018

Я новичок в MongoDb и был бы признателен за помощь в этом вопросе.Я написал следующий конвейер агрегации.Я написал запрос, который возвращает записи за последние 24 часа, после чего я получаю записи с (00:01) до (05:00) часов.С помощью этого я могу получить записи между (20:00) и (23:59) часами.Кто-нибудь, пожалуйста, предложите мне.

db.collection.aggregate([
  {$match: {createDate: {$gte: new Date(new Date(ISODate().getTime() - 1000*60*60*24))}}},
  {
    $project: {
        hour:    { $hour: "$createDate" },
        minutes: { $minute: "$createDate" },
      }
  },
  { 
    $match: {
      $and: [{"hour": { "$gte" : 0}},{"minutes":{ "$gte" : 1}}],
      $and: [{"hour": { "$lte" : 5}}],
    }
  },
])

Выход:

{
  "hour" : 0
  "minutes" : 1
}

/* 2 */

{
  "hour" : 4
  "minutes" : 2
}

Ожидаемый результат:

{  
  "hour" : 0
  "minutes" : 1
}

/* 2 */

{
  "hour" : 4
  "minutes" : 2
},
{
  "hour" : 4
  "minutes" : 59
}

и

{  
  "hour" : 20
  "minutes" : 1
}

/* 2 */

{
  "hour" : 22
  "minutes" : 2
},
{
  "hour" : 23
  "minutes" : 59
}

1 Ответ

0 голосов
/ 12 сентября 2018

Расширяя комментарий JohnnyHK, этот $match должен работать в течение 20:00 - 23: 59.

// 20:00 - 23:59
{ 
  $match: { 
    hour: { $gte: 20, $lt: 24 }
  }
}

Если вы хотите получить оба ответа одновременно, вы можете использовать $or, чтобы включить все критерии.

{ 
  $match: { 
    $or: [
      < 0-5 hour criteria >,
      < 20-24 hour criteria >
    ]
  }
}

Вариации на 0-5 часов

// 00:00 - 04:59
{ 
  $match: { 
    hour: { $gte: 0, $lt: 5 } 
  }
}

// 00:01 - 04:59
{ 
  $match: { 
    $or: [
      { hour: 0, minutes: { $gt: 0 }}, // 00:01 - 00:59
      { hour: { $gt: 0, $lt: 5 }}      // 01:00 - 04:59
    ]
  }
}

// 00:01 - 05:00
{ 
  $match: { 
    $or: [
      { hour: 0, minutes: { $gt: 0}},  // 00:01 - 00:59
      { hour: { $gt: 0, $lt: 5 }},     // 01:00 - 04:59
      { hour: 5, minutes: 0}           // 05:00
    ]
  }
}

// 00:00 - 05:00
{ 
  $match: { 
    $or: [
      { hour: { $gte: 0, $lt: 5 }},    // 00:00 - 04:59
      { hour: 5, minutes: 0 }          // 05:00
    ]
  }
}

Собираем все вместе

// 00:01 - 04:59 AND 20:00 - 23:59
{ 
  $match: { 
    $or: [
      { hour: 0, minutes: { $gt: 0}},  // 00:01 - 00:59
      { hour: { $gt: 0, $lt: 5 }},     // 01:00 - 04:59
      { hour: 5, minutes: 0},          // 05:00
      { hour: { $gte: 20, $lt: 24 }}   // 20:00 - 23:59
    ]
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...