【问题标题】:How to filter date with golang and mongodb?如何使用 golang 和 mongodb 过滤日期?
【发布时间】:2020-11-02 15:57:33
【问题描述】:

我正在尝试使用 golang 从 mongodb 查询记录,但似乎无法正常工作。我尝试使用 ISODate() 使用 mongo cli 运行查询,它可以工作,但我不确定如何使用 golang 调用 ISODate。下面是我正在运行的代码的 sn-p。

type Record struct{
    ID         primitive.ObjectID `bson:"_id"`
    PropertyID primitive.ObjectID `bson:"propertyID"`
    CreatedAt  primitive.DateTime `bson:"createdAt"`
}
// ....
cur, err := collection.Find(ctx, bson.M{"createdAt": bson.M{
    "$gte": time.Now().UTC().AddDate(-1, 0, 0).Format(time.RFC3339),
}})
// ....
var recs []Record
err = cur.All(ctx, &recs)

如果我运行 len(recs) 我得到 0 但在 mongo-cli 中我在运行下面的代码时得到结果。

db.getCollection('records').find({
    createdAt: {
        $gte: ISODate("2019-11-02T23:16:58+08:00")
    }
}).sort({createdAt: -1})

顺便说一下2019-11-02T23:16:58+08:00time.Now().UTC().AddDate(-1, 0, 0).Format(time.RFC3339)的输出

在此先感谢大家:D

【问题讨论】:

  • CreatedDate 声明为time.Time,并在查询中使用time.Time
  • 谢谢,所有答案都是有效的并且正在运行。有趣的是我也使用过primitive.NewDateTimeFromTime,但我认为它不起作用,因为没有记录,但是当我记录cur.All(ctx, &rec) 返回的错误时,现在我看到了问题。一些记录未定义为 propertyID。

标签: mongodb go


【解决方案1】:

试试primitive.NewObjectIDFromTimestamp

您可以从那里将time.Time 转换为primitive.ObjectID,反之亦然。

func NewObjectIDFromTimestamp(timestamp time.Time) ObjectID

NewObjectIDFromTimestamp 根据给定时间生成一个新的 ObjectID。

或者primitive.NewDateTimeFromTime,是什么创建了DateTime

func NewDateTimeFromTime(t time.Time) DateTime

NewDateTimeFromTime 根据时间创建一个新的 DateTime。

然后将其传递给您的查询过滤器,如下所示:

cur, err := collection.Find(ctx, bson.M{"createdAt": bson.M{
    "$gte": primitive.NewDateTimeFromTime(time.Now().AddDate(-1, 0, 0)),
}})

【讨论】:

    【解决方案2】:

    由于CreatedAt 属于primitive.Datetime 类型,因此在您对CreatedAtbson.M 查询中,您需要传递primitive.Datetime 对象。

    Golang 的 mongo 驱动程序为您处理编组。

    cur, err := collection.Find(ctx, bson.M{"createdAt": bson.M{
        "$gte": primitive.NewDateTimeFromTime(time.Now())
    }})
    

    【讨论】:

      【解决方案3】:

      这是一个使用 bson.D 和聚合的简单示例:

      import "go.mongodb.org/mongo-driver/bson/primitive"
      
          mongo.Pipeline{
                  {{"$match", bson.D{
                      {"createdAt", bson.D{
          {"$gt", primitive.NewDateTimeFromTime(time.Now().AddDate(0, 0, -30))}}}},
                  }}}
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-05
        • 1970-01-01
        • 1970-01-01
        • 2019-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        相关资源
        最近更新 更多