2014-01-24 190 views
0

如果我想找到一個特定的一天創建的文檔,到現在爲止我從當天的第一分鐘在幾秒鐘內使用的範圍 ,以當天的最後一分鐘,某事像:MongoDb日期查詢不使用範圍?

query":{"dtCreated":{"$gte":{"sec":1381356782,"usec":0},"$lt":{"sec":1389356782,"usec":0}}} 

是否可以以某種方式查找只有日,月和年等於「dtCreated」的所有文檔?

像僞代碼:

query:{"dtCreated":ISODate("2014-01-23")} <- i know that may not be a valid iso date 

,但我想要的是找到一天的所有文檔,而無需使用LT和GT?

Sry對於英語不好和任何暗示都要提前致謝!

回答

1

您可以使用date aggregation operators與聚合框架來完成此操作。 假設dtCreated是一種ISODate場,你可以嘗試這樣的事:

query = [ 
    { 
     '$project': { 
      'year': {'$year':'$dtCreated'}, 
      'month': {'$month':'$dtCreated'}, 
      'day':{'$dayOfMonth':'$dtCreated'} 
     } 
    }, 
    { 
     '$match' : {'year':'2014', 'month':'1', day:'1'} 
    } 
] 

db.mycollection.aggregate(query) 

編輯:作爲ORID正確的言論,雖然這是一個回答你的問題(查詢日期時不使用日期範圍),這是不是解決問題的好方法。我可能會這樣做:一個範圍大於或等於今天,但比明天還要小

db.foo.find({'dtCreated':{'$gte':ISODate("2014-01-23"), '$lt':ISODate("2014-01-24")}}) 
+0

不錯的一個工作輝煌一直是我正在尋找! ! !非常感謝 –

+0

@johnSmith請注意,雖然上面的代碼工作正常,但它遠非無害。因爲它首先使用了「$ project」,所以它不會過濾集合中的任何文檔,儘管您真的想匹配一天。其次,'$ match'如果存在,則不能使用dtCreated索引,因爲它不直接使用來自集合的數據。你的方法沒有錯('$ gt'&'$ lt'查詢)。如果你堅持,你可以添加一個額外的領域的平等,其價值是一年中的第 –

+0

我意識到這一點。不幸的是日期操作符在彙總框架之外是不可用的 – Mzzl