2014-11-04 88 views
0

我用教條2寫入的MongoDB和實體看起來是這樣的:Doctrine2的MongoDB和時間戳

{ 
    "_id" : ObjectId("54538be2516bd636738b46f2"), 
    "department" : "Assistance", 
    "action" : "DONE", 
    "idAppointment" : 2197, 
    "service_order" : "F4889109", 
    "access_number" : "164016178", 
    "so_type" : "DERA", 
    "stage" : "D40", 
    "id_va" : "FT452926", 
    "id_icms" : "F4889109", 
    "ref_isp" : "", 
    "comment" : "", 
    "first_available_schedule" : Timestamp(1414623600, 168), 
    "asap" : false, 
    "allday" : "NO", 
    "operator" : "HD8", 
    "created" : Timestamp(1414761442, 169) 
} 

現在我要讓上的時間戳查詢要麼QueryBuilder的或者在命令行,但我不不知道如何做到這一點。任何幫助將不勝感激。

回答

1

對於初學者,您似乎在使用Timestamp BSON類型時,實際上應該使用Date類型。在ODM中,這些分別使用@Timestamp@Date註釋。在PHP驅動程序中,相關驅動程序類別分別爲MongoTimestampMongoDate

正如上面的BSON文檔鏈接所述,Timestamp旨在供內部使用(MongoDB在複製oplog中使用它)。如果您在應用程序中存儲日期和時間,那麼日期時間肯定是您應該使用的。

查看ODM文檔中的@Timestamp示例,很不幸,該示例在$created字段中顯示該示例。我們最好使用不太令人鼓舞的字段名稱,並添加一個註釋,表明用戶可能不想將字段映射爲@Timestamp

如果確實將字段映射爲@Date,那麼您應該可以像使用其他字段和運算符(與日期值相關)一樣使用查詢構建器。在準備查詢時,DocumentPersister::prepareQueryOrNewObj()最終將通過DateType::convertToDatabaseValue()運行對應於日期映射字段的查詢值。這意味着該值可能是整數時間戳,DateTime或MongoDate實例。一個字符串也是合適的,只要它與strtotime()一起工作。

+0

我錯過了這一章,所以thx很多。現在我必須將創建的字段更新爲日期格式。你會如何建議這樣做? Regards – cwhisperer 2014-11-13 09:00:18

+0

這最好用遷移腳本完成,該腳本使用['$ type'](http://docs.mongodb.org/manual/reference/operator/query/type/)操作符查詢要遷移的文檔並進行更新每個文件。由於BSON時間戳和日期字段都是64位整數,所以您不必擔心文檔增長(所有更新都應在原地)。一個PHP CLI腳本應該很好地完成這項工作,並且應該很容易編寫它,以便可以在早期終止它時拾取並恢復遷移。 – jmikola 2014-11-13 17:15:23