2013-05-01 134 views
3

如果日期相同,使用$gt查詢未按預期工作。這更像是$gteMongoDB查詢日期

但是,如果我添加1秒查詢參數然後它的作品。

這是示例查詢;

我有一個文件,它是creation_date1367414837時間戳。

db.collection.find({creation_date : {'$gt' : new Date(1367414837000)}}); 

這個查詢與文檔匹配該日期的1367414837 如果我增加了查詢時間戳只是一個像1367414838。它工作的預期。

使用蒙戈控制檯,但我有MongoDate

編輯在PHP同樣的問題林:查詢的輸出

db.collection.findOne({creation_date : {'$gt' : new Date(1367414837000)}}); 
{ 
    "_id" : ObjectId("5181183543c51695ce000000"), 
    "action" : { 
     "type" : "comment", 
     "comment" : { 
      "id" : 74, 
      "post_id" : "174", 
      "owner_id" : "5", 
      "text" : "ne diyeyim lae :D", 
      "creation_date" : "2013-05-01 16:27:17" 
     } 
    }, 
    "creation_date" : ISODate("2013-05-01T13:27:17.336Z"), 
    "owner" : { 
     "id" : "5", 
     "username" : "tylerdurden" 
    } 
} 

EDIT2:問題是蒙戈的PHP擴展。它被記錄爲「文檔發送到數據庫/從數據庫發送時超過毫秒的任何精度都將丟失」。 http://php.net/manual/en/class.mongodate.php

我增加了查詢參數一秒鐘作爲週轉解決方案。

+0

您能顯示該查找的輸出嗎? creation_date的類型是什麼?上述查找的輸出是什麼(更改查找findOne以便只返回一個文檔)。 – 2013-05-01 19:16:58

+0

@AsyaKamsky我編輯輸出的問題。 – 2013-05-01 19:34:26

+2

所以它看起來像日期不一樣 - 他們在毫秒組件差異... – 2013-05-01 19:58:11

回答

3

Dates in BSON是UNIX日期等於自紀元以來的毫秒數;它們精確到毫秒級。如果您插入(並嘗試匹配)的時間精確到毫秒級別,那麼您嘗試匹配的元素可能比您要查詢的時間戳稍晚幾毫秒,並且$gt可能正在工作預期。 (2013-05-01T13:27:17.001Z確實晚於2013-05-01T13:27:17Z)。

+0

我看到但我查詢的是實際上我從集合輸出的日期。我從mongo獲取日期並將其作爲參數傳遞給查詢函數。因此與'$ gt'相同的日期比較與任何人都不匹配,對吧? – 2013-05-01 19:34:00

+0

看起來您將文檔中「creation_date」的值與action.comment子文檔中嵌套的「creation_date」混淆在一起。它看起來像你的子文檔中的值只能精確到整秒,這就是爲什麼你期望「$ gt」不返回這個文檔,儘管它在主文檔中的「creation_date」的值是336毫秒。如果您確實想查詢子文檔中的日期,請針對{「action.comment.creation_date」:{「$ gt」,new Date(TIMESTAMP_GOES_HERE)}}進行查找。 – 2013-05-01 20:26:17

+1

實際上我想查詢父文檔,所以查詢是正確的。但正如你所提到的,Asya提到,我不能期望有時差。我正在尋找php MongoDate對象來解決這個問題。它看起來像MongoDate不準確.. – 2013-05-01 20:52:40