2014-11-04 51 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