如何使用mgo和Go查询MongoDB的日期范围?

20

嗨,我有一个名为“my_sales”的集合,其中包含产品名称、价格和销售日期字段。

我的文档看起来像这样

{
    "_id" : ObjectId("5458b6ee09d76eb7326df3a4"),
    "product_name" : product1,
    "price" : 200,
    "sale_date" : ISODate("2014-11-04T11:22:19.589Z")
}
{
    "_id" : ObjectId("5458b6ee09d76eb7326df3a4"),
    "product_name" : product1,
    "price" : 200,
    "sale_date" : ISODate("2014-11-04T11:22:19.589Z")
}
{
    "_id" : ObjectId("5458b6ee09d76eb7326df3a4"),
    "product_name" : product1,
    "price" : 200,
    "sale_date" : ISODate("2014-11-04T11:22:19.589Z")
}
{
    "_id" : ObjectId("5458b6ee09d76eb7326df3a4"),
    "product_name" : product1,
    "price" : 200,
    "sale_date" : ISODate("2014-11-05T11:22:19.589Z")
}

我在mongo shell中尝试这样做

 db.my_sales.find({ sale_date: { $gt: ISODate("2014-11-04"), $lt: new ISODate("2014-11-05") });

它能够给出正确的结果。现在我需要使用 Golang 查询相同的内容。我尝试了以下方式:

 var sales_his []Sale
 err := c.Find(bson.M{"sale_date":bson.M{ "$gt": "ISODate("+date_from+")", "$lt": "ISODate("+date_to+")" }    }).All(&sales_his)

它正在返回null结果,请帮助。


请查看此日期范围搜索 - Muhammad Tariq
3个回答

49

mgo 支持使用time.Time 作为 BSON 日期。

因此,如果你的结构体看起来像这样:

type Sale struct {
    ProductName string    `bson:"product_name"`
    Price       int       `bson:"price"`
    SaleDate    time.Time `bson:"sale_date"`
}

然后你可以像这样查询它:

fromDate := time.Date(2014, time.November, 4, 0, 0, 0, 0, time.UTC)
toDate := time.Date(2014, time.November, 5, 0, 0, 0, 0, time.UTC)

var sales_his []Sale
err = c.Find(
    bson.M{
        "sale_date": bson.M{
            "$gt": fromDate,
            "$lt": toDate,
        },
    }).All(&sales_his)

这实际上非常简单。你能给我一个可以输入动态值的示例吗? - Faris Rayhan

4

我有一种新的查询日期范围的方法:

// convert to date
fromTime := time.Unix(1509358405981/1000, 0)     

// Convert date to ObjectID with time    
fromObjectBson := bson.NewObjectIdWithTime(fromTime)

// condition     
bson.M{"_id":bson.M{"$gt": fromObjectBson}} 

这将加速您的查询。

这个代码通过 _id 属性进行过滤,但是提问者想要通过 sale_date 属性进行过滤。 - icza
你可以生成其他的 ObjectId。 - Vui Teenmax

-1

你也可以查看这个。如果你正在使用这种方法,那么请使用parse:

db.getCollection('user').find({
    createdOn: {
        $gt: ISODate("2020-01-01T00:00:00.000Z"),
        $lt: ISODate("2020-03-01T00:00:00.000Z")
    }
})

无需解析的函数: 使用字符串获取值

db, err := GetDB()
if err != nil {
    return nil, err
}
defer db.Session.Close()

var date []models.User

coll := db.C(constants.USERTABLE)

findQuery := bson.M{"createdOn": bson.M{"$gt": echo.FromDate, "$lt": echo.ToDate}}

shared.BsonToJSONPrint(findQuery)

err = coll.Find(findQuery).All(&date)
if err != nil {
    return nil, err
}
return date, nil
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接