How can I query MongoDB with date range using mgo and Go?

22,686

Solution 1

mgo supports time.Time for BSON dates.

So if your struct looks like this:

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

Then you can query it like this:

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)

Solution 2

I have new way to query date range:

// 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}} 

This will speedup your query.

Share:
22,686
manigandand
Author by

manigandand

I am enthusiastic in learning new technologies and I'm currently working as Software Engineer for Launchyard Technologies, using Golang, PostgreSQL, gRPC, Python to build micro-services for #AirCTO. Experience in web development both back-end and front-end. I'm continuously learning new technologies. Expertise In: Golang , gRPC, PHP, Laravel, Web Services/Micro Services, Web Application, REST A PI, MongoDB, MySQL, PostgreSQL, Javascript, JQuery, AJAX, HTML, CSS, Bootstrap,GIT

Updated on July 05, 2022

Comments

  • manigandand
    manigandand almost 2 years

    Hi I have a collection named "my_sales" having fields product_name, price, sale_date.

    My doc looks like

    {
        "_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")
    }
    

    I tried in mongo shell like this

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

    It giving the correct result. Now I need to query same thing using golang I tried like this

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

    Its giving null result please help