Найти все документы 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 для установки значения поля на текущую дату.