英文:
Find all mongo db documents with timestamps less than 10 seconds
问题
我正在尝试获取所有时间戳早于10秒前的MongoDB文档,但是没有找到任何文档。我认为这是因为我的时间格式不正确。我在过去24小时内使用MongoDB的shell查询时没有找到它们,查询语句为db.mgo.find({timestamp:{$gt: new Date(ISODate().getTime() - 86400)}})。
// 查找最近10分钟的文档
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")
英文:
I am trying to get all mongo db documents with timestamps less than 10 seconds ago. I am not finding any. I think this is because my time format is not correct. I am not finding them querying mongo db from shell db.mgo.find({timestamp:{$gt: new Date(ISODate().getTime() - 86400)}}) for last 24h.
// 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
}
If I pick one of document ObjectId("...").getTimestamp() it shows ISODate("2017-08-25T19:14:54Z") which is about 4h ahead of me so it is UTC. But even if I change to UTC in my func it still not finding any documents
t := time.Now().UTC().Add(-time.Duration(10)*time.Minute).Format("2006-01-02 15:04:05")
答案1
得分: 1
即使我在我的函数中更改为UTC,它仍然找不到任何文档。
这是因为您的文档中没有timestamp
字段。您使用的查询语法相当于询问“选择所有时间戳大于T的文档”。
我猜您的意思是使用每个文档的ObjectId派生的时间戳值,使用getTimestamp()
方法。如果是这样的话,您可以利用mgo/bson包中的NewObjectIdWithTime()函数,示例如下:
currentTime := time.Now()
queryTime := currentTime.Add(-10 * time.Second)
// 生成一个带有指定时间戳的虚拟ObjectId用于查询
var oidtime = bson.NewObjectIdWithTime(queryTime)
query := bson.M{"_id": bson.M{"$gt": oidtime}}
err := collection.Find(query).All(&documents)
上述代码反转了查询方式,不再使用时间来查询,而是利用ObjectId来查询。否则,您将不得不获取每个文档,将其ObjectId转换为时间戳并进行比较,这可能不太高效。
另外,根据您的用例,您可以使用$currentDate操作符为每个文档添加一个timestamp
值,以将字段的值设置为当前日期。
英文:
> But even if I change to UTC in my func it still not finding any documents
This is because there is no field timestamp
within your document. The query syntax that you're using is equivalent to ask select all documents where timestamp is greater than T from the collection
.
I assume that what you're meaning to do is to use the timestamp value derived from the ObjectId of every documents using getTimestamp()
method. If this is the case, you can utilise mgo/bson function NewObjectIdWithTime() see example as below:
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)
The above reversed your querying, instead of using time to query we utilises ObjectId to query. Otherwise you would have to fetch every document, convert their ObjectId's to timestamp and compare, which may not be as efficient.
Alternatively, depending on your use case you can add a timestamp
value for each document using $currentDate operator
to set the value of a field to the current date.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论