мангуст — поиск по созданному времени, не зависящему от даты

#node.js #mongodb #mongoose #mongodb-query

#node.js #mongodb #мангуст #mongodb-запрос

Вопрос:

У меня есть следующая модель мангуста

 const Post = new Schema({
  created_at: { type: Date, default: Date.now() },
  updated_at: { type: Date },
  postName: String,
  postContent:String,
  promoted: {
    isPromoted: { type: Boolean, default: false, required: true },
    promotedFrom: { type: Date },
    promotedTill: { type: Date },
  },
});
  

Пример документа

 const Post = new Schema({
  created_at: 2020-07-05T16:16:38.139 00:00,
  postName: My first Post,
  postContent:This is my furst post,
  promoted: {
    isPromoted: true,
    promotedFrom: 2020-11-13T16:14:38.139 00:00,
    promotedTill: 2020-11-20T16:14:38.139 00:00,
  },
});
  

С помощью mongose я хочу запрашивать документы с увеличенным временем, которое должно составлять от 12.00 до 16.30 часов, независимо от какой-либо даты.

Заранее спасибо.

Ответ №1:

Отрегулируйте gt и lt , чтобы включить / исключить границы:

 db.foo.aggregate([
{$match: {$expr: {
            $and: [
{$gt: [ {$hour: "$promoted.promotedTill"}, 12 ]},
{$lte: [{$hour: "$promoted.promotedTill"},16]},
{$lt: [{$minute: "$promoted.promotedTill"},30]}
                    ]}
    }}

  ]);
  

Ответ №2:

проверьте этот пример

Я выполнил запрос довольно просто, без других полей.

Запрос такой:

 db.collection.find({
  "$and": [
    {
      "promoted.promotedFrom": {
        "$gte": ISODate("yourdate")
      }
    },
    {
      "promoted.promotedTill": {
        "$lte": ISODate("yordate")
      }
    }
  ]
})
  

В основном это поиск значения в диапазоне, используя $gte (больше или равно) и $lte (меньше или равно).

При использовании $and оператора оба условия должны быть истинными.

Комментарии:

1. Спасибо за ответ. Мне нужно отфильтровать документ по часам в дате. не по числу

2. Я добавил пример с датами. Но, как я уже сказал, это точно то же самое. Mongo обрабатывает сравнение дат и чисел таким же образом. Итак, если запрос работает, сравнивая числа, он будет работать с датами. Проверьте второй пример.

3. Из вашего второго примера вы отфильтровали по дате, что даст мне весь документ между датой начала и датой окончания. но мое требование — фильтровать по времени начала и времени окончания.

4. Вы можете поместить нужную дату в запрос. Вы можете создать дату в js или что угодно и передать ее в запрос mongo. Это ваш вопрос или я что-то не понял?

5. Вопрос неправильно понят. Если мое время с 12.00, а время до 16.30, документ со временем 11.59 не должен быть извлечен