查找时间戳小于10秒的所有mongo db文档

时间:2017-08-25 19:32:46

标签: mongodb go timestamp mgo

我正在尝试使用时间戳小于10秒的所有mongo db文档。我找不到任何东西。我想这是因为我的时间格式不正确。我没有找到他们从shell查询mongo db 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(&#34; ...&#34;)。getTimestamp() 之一,则会显示 ISODate (&#34; 2017-08-25T19:14:54Z&#34;) 这比我提前4小时左右,所以它是UTC。但即使我在我的功能中更改为UTC,它仍然没有找到任何文件

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

1 个答案:

答案 0 :(得分:1)

  

但即使我在我的功能中更改为UTC,它仍然没有找到任何文件

这是因为您的文档中没有字段timestamp。您使用的查询语法等同于询问select all documents where timestamp is greater than T from the collection

我认为您要做的是使用getTimestamp()方法使用从每个文档的ObjectId派生的时间戳值。如果是这种情况,您可以使用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转换为时间戳并进行比较,这可能效率不高。

或者,根据您的使用情况,您可以使用$currentDate operator为每个文档添加timestamp值  将字段的值设置为当前日期。