我需要监控创建记录的时间,以便进一步查询和修改。
在我的脑海中闪现的第一件事就是给文档一个“createDateTime”字段,默认值为“new Date()”,但是Mongodb表示文档_id有一个嵌入的时间戳,并且id是在文档已创建,因此为此添加新字段听起来很虚假。 很多次,我看到人们为他们的数据设置了“createDateTime”,我不知道他们是否知道mongodb的_id的细节。我想知道我应该将_id用作“createDateTime”字段吗?什么是最佳做法? 和利弊。
感谢任何提示。
答案 0 :(得分:3)
是,你应该。除了直接查看数据库的人类可读性之外,没有理由不这样做。另请参阅here和here。
如果您想使用aggregation framework按_id
内的日期进行分组,则无法正常使用WiredPrairie。你可能会注意到open jira ticket。但是,您当然可以使用Map-Reduce和ObjectID.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个。