Найти все документы mongo db с отметками времени менее 10 секунд

Я пытаюсь получить все документы mongo db с отметками времени менее 10 секунд назад. Я не нахожу ни одного. Я думаю, это потому, что мой формат времени не правильный. Я не нахожу их запрашивающими mongo db из оболочки db.mgo.find({timestamp:{$gt: new Date(ISODate(). GetTime() - 86400)}}) за последние 24 часа.

// FindLast 10min
func FindLast(session *mgo.Session, db, collection string) ([]Syslog, error) {
  var results []Syslog
  t := time.Now().Add(-10 * time.Second)
  c := session.DB(db).C(collection)
  err := c.Find(
    bson.M{
        "timestamp": bson.M{
            "$gt": t,         
        },
  }).All(&results)
  return results, err
}

Если я выбираю один из объектов ObjectId("..."). GetTimestamp(), он показывает ISODate("2017-08-25T19:14:54Z"), который примерно на 4 часа впереди меня, поэтому это UTC. Но даже если я перехожу на UTC в моей функции, он все равно не находит никаких документов

t := time.Now().UTC().Add(-time.Duration(10)*time.Minute).Format("2006-01-02 15:04:05")

1 ответ

Решение

Но даже если я перехожу на UTC в моей функции, он все равно не находит никаких документов

Это потому что нет поля timestamp в вашем документе. Синтаксис запроса, который вы используете, эквивалентен запросу select all documents where timestamp is greater than T from the collection,

Я предполагаю, что вы собираетесь использовать значение метки времени, полученное из ObjectId каждого документа, использующего getTimestamp() метод. Если это так, вы можете использовать функцию mgo / bson NewObjectIdWithTime (), см. Пример, как показано ниже:

currentTime := time.Now()
queryTime := currentTime.Add(-10 * time.Second)

// Generate a dummy ObjectId with a specified timestamp for querying
var oidtime = bson.NewObjectIdWithTime(queryTime)
query := bson.M{"_id": bson.M{"$gt": oidtime}}
err := collection.Find(query).All(&documents)

Вышеописанное полностью изменило ваши запросы, вместо того, чтобы использовать время для запроса, мы используем ObjectId для запроса. В противном случае вам придется извлекать каждый документ, преобразовывать их ObjectId в отметку времени и сравнивать, что может быть не столь эффективно.

Кроме того, в зависимости от вашего варианта использования вы можете добавить timestamp значение для каждого документа, используя оператор $ currentDate для установки значения поля на текущую дату.

Другие вопросы по тегам