我应该在“_id”中使用时间戳吗?

时间:2014-02-16 13:02:09

标签: mongodb timestamp

我需要监控创建记录的时间,以便进一步查询和修改。

在我的脑海中闪现的第一件事就是给文档一个“createDateTime”字段,默认值为“new Date()”,但是Mongodb表示文档_id有一个嵌入的时间戳,并且id是在文档已创建,因此为此添加新字段听起来很虚假。

很多次,我看到人们为他们的数据设置了“createDateTime”,我不知道他们是否知道mongodb的_id的细节。

我想知道我应该将_id用作“createDateTime”字段吗?什么是最佳做法? 和利弊。

感谢任何提示。

2 个答案:

答案 0 :(得分:3)

,你应该。除了直接查看数据库的人类可读性之外,没有理由不这样做。另请参阅herehere

如果您想使用aggregation framework_id内的日期进行分组,则无法正常使用WiredPrairie。你可能会注意到open jira ticket。但是,您当然可以使用Map-ReduceObjectID.getTimestamp()执行此操作。可以找到一个示例here

答案 1 :(得分:3)

我实际上说这取决于您希望如何使用日期。

例如,使用聚合框架Date运算符无法操作。

将失败,例如:

db.test.aggregate( { $group : { _id:  { $year: "$_id" } } })

发生以下错误:

"errmsg" : "exception: can't convert from BSON type OID to Date"

(无法从ObjectId中提取日期。)

因此,如果您想在聚合中进行任何类型的日期数学运算,那么通常简单日期操作的操作会变得复杂得多。拥有createDateTime标记要容易得多。使用具有不同createdDateTime字段的聚合来计算在特定年份和月份中创建的文档数量将很简单。

您可以在某种程度上对ObjectId进行排序。 ObjectId的{​​{3}}无法以有意义的方式排序。大多数MongoDB驱动程序默认在驱动程序中而不是在数据库上创建ObjectId。因此,如果您有多个客户端(例如Web服务器)创建新文档(以及新的ObjectId),则时间戳将仅与各种服务器一样准确。

此外,根据您所需的精度,使用8个字节存储ISODate值,而不是ObjectId中使用的4个。