Вернуть данные из MongoDB Atlas со временем один час назад

У меня есть это поле в collection в базе данных в MongoDB Atlas .

created_at : 2019-10-09T10:55:00.202+00:00

Как создать запрос в API Node Express для возврата данных по часам в соответствии с полем created_at?

Например, за час до этого времени.

Я решил это, выполнив это, где -3 - местный UTC:

var now = new Date();
var ago = new Date();
ago.setHours(now.getHours() - 3 - hour_range);
mymodel.find({device: req.params.device_id, created_at: {$gte : ago, $lt : now} }).exec(function (err, measures) {
    if (err)
        res.send(err);
    res.json({
        message: 'listing...',
        data: measures
    });
});
1
задан 30.11.2019, 02:53
1 ответ

SegГєn ты комментируешь, что со мной случается, он состоит в том, чтобы группировать документы на основании часа, я показываю возможную одну тебе soluciГіn:

  • Данных о вводе примера:

[
  {
    "info": "uno",
    "created_at": ISODate("2016-04-30T13:00:00Z")
  },
  {
    "info": "dos",
    "created_at": ISODate("2016-04-30T14:00:00Z")
  },
  {
    "info": "tres",
    "created_at": ISODate("2016-04-30T05:00:00Z")
  },
  {
    "info": "cuatro",
    "created_at": ISODate("2016-04-30T05:00:00Z"),
  }
]
  • Кери де Монгодб:

db.collection.aggregate([
  {
    $group: {
      _id: {
        $hour: "$created_at" // Identificador unico
      },
      data: {
        $push: "$ROOT" // Añade todos los documentos con esa hora en un campo 'data'
      }
    }
  }
])
  • Результатов:

[
  {
    "_id": 5,
    "data": [
      {
        "_id": ObjectId("5a934e000102030405000002"),
        "created_at": ISODate("2016-04-30T05:00:00Z"),
        "info": "tres"
      },
      {
        "_id": ObjectId("5a934e000102030405000003"),
        "created_at": ISODate("2016-04-30T05:00:00Z"),
        "info": "cuatro"
      }
    ]
  },
  {
    "_id": 13,
    "data": [
      {
        "_id": ObjectId("5a934e000102030405000000"),
        "created_at": ISODate("2016-04-30T13:00:00Z"),
        "info": "uno"
      }
    ]
  },
  {
    "_id": 14,
    "data": [
      {
        "_id": ObjectId("5a934e000102030405000001"),
        "created_at": ISODate("2016-04-30T14:00:00Z"),
        "info": "dos"
      }
    ]
  }
]
  • , Выданные в часы:

Последованные
db.collection.aggregate([
      {
        $group: {
          _id: {
            $hour: "$created_at" // Identificador unico
          },
          data: {
            $push: "$ROOT" // Añade todos los documentos con esa hora en un campo 'data'
          }
        }
      },
      {
        $match: {
            _id: 5 //Filtramos por el campo donde se agrupan las horas
        }
      }
    ])
  • :

   [
      {
        "_id": 5,
        "data": [
          {
            "_id": ObjectId("5a934e000102030405000002"),
            "created_at": ISODate("2016-04-30T05:00:00Z"),
            "info": "tres"
          },
          {
            "_id": ObjectId("5a934e000102030405000003"),
            "created_at": ISODate("2016-04-30T05:00:00Z"),
            "info": "cuatro"
          }
        ]
      }
    ]
  • Query с датой parseada в добавочном (Изданном) поле:

db.collection.aggregate([
          {
            $addFields: { //Añade un campo 'convertedDate'
              convertedDate: { $toDate: "$created_at" } //Tranforma el campo 'created_at' en un formato fecha
            }
          },
          {
            $group: {
              _id: {
                $hour: "$convertedDate" // Identificador unico
              },
              data: {
                $push: "$ROOT" // Añade todos los documentos con esa hora en un campo 'data'
              }
            }
          },
          {
            $match: {
                _id: 5 //Filtramos por el campo donde se agrupan las horas
            }
          }
        ])

Подождал, что он возможный soluciГіn, я помог тебе решать проблему.

2
ответ дан 01.12.2019, 10:40
  • 1
    ReferenceError: ISODate is not defined – asterix 29.11.2019, 13:40
  • 2
    Если я делаю консультацию этой формы, я могу просачиваться по рангу часов: created_at: { $gte: ' 2019-11-29T08:03:53.915Z' $lt: 2019-11-29T12:03:53.915Z, но не sé как добивание, чтобы он это сделал автоматически. Así как $gte: Восходите () - 3 часа $lt Восходил () .now – asterix 29.11.2019, 13:41
  • 3
    Для различия между датами ты можешь консультировать этот ответ – Angel 29.11.2019, 16:58
  • 4
    @asterix он думал, что ты работал бы с датами в базе данных, но segú n твой комментарий эти с String. Для этого случая ты имеешь два шага, серьезный parsear весь твой DB по отношению к Date (я рекомендую это тебе, чтобы работать с датами в будущем) или añ adir поле с датой pareada и работать с этим новым полем. Я издаю тебя solució n для того, чтобы ты смог видеть как. – planta4 29.11.2019, 22:11
  • 5
    я работаю с датами, было одиноким доказательство comparació n. Сервер mongodb Атлас, получив информацию, это сохраняет со всеобщим скоординированным временем +0 – asterix 30.11.2019, 23:18