2014-11-06 24 views
8

您好我有一個名爲「my_sales」的集合,其中包含字段product_name,price,sale_date。如何使用mgo和Go查詢具有日期範圍的MongoDB?

我的文檔看起來像

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

我在蒙戈外殼試過這樣

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) 

查詢同樣的事情,它給空的結果,請幫助

回答

20

氧化鎂支持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) 
0

我要查詢的日期範圍新的方式:

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

這將加快您的查詢。