我正在尝试获取时间戳少于 10 秒前的所有 mongo 数据库文档。我没有找到任何。我认为这是因为我的时间格式不正确。我没有发现他们从 shell db.mgo.find({timestamp:{$gt: new Date(ISODate().getTime() - 86400)}})db.mgo.find({timestamp:{$gt: new Date(ISODate().getTime() - 86400)}})/strong> 过去 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")
最佳答案
But even if I change to UTC in my func it still not finding any documents
这是因为您的文档中没有字段 timestamp
。您使用的查询语法等同于要求从集合中选择时间戳大于 T 的所有文档
。
我假设您的意思是使用从 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)
上面反了你的查询,不是用time查询而是用ObjectId查询。否则,您将不得不获取每个文档,将它们的 ObjectId 转换为时间戳并进行比较,这可能效率不高。
或者,根据您的用例,您可以使用 $currentDate operator 为每个文档添加一个 timestamp
值。
将字段的值设置为当前日期。
关于mongodb - 查找时间戳小于 10 秒的所有 mongo db 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45888313/