将$ currentDate的字段插入Meteor中的MongoDB集合

Mal*_*rik 16 javascript mongodb meteor mongodb-query

在Meteor中将文档插入MongoDB集合时,不确定如何使用$ currentDate.

这只能用于更新,而不是插入吗?看起来很奇怪,但我没有看到替代品(除了使用new Date替代品).

Stuff.insert({ 
   owner: Meteor.userId(),
   createdAt: ..., // how to create this field with $currentDate ?
   theStuff: "Some of the good stuff"
})
Run Code Online (Sandbox Code Playgroud)

Notes/Thoughts/TL,DR

  • 字段不能以$运算符开头,或者据我所知,大括号{}.
  • 如果确实如此,那么拥有仅适用于更新的运营商有什么意义呢?
  • 为什么/何时$currentDatenew Date
  • 如果使用Moment.js esp,一个好处是$ currentDate以ISO 8601格式输入.
  • 答案是从一开始就做某种事吗?如果是这样,这会产生意想不到的后果吗?

sty*_*ane 26

如果确实如此,那么拥有仅适用于更新的运营商有什么意义呢?

$currentDate是一个更新操作符,因此您不能将其与该collection.insert方法一起使用.但是,当没有文档符合查询条件时upsert,true它何时会创建新文档.MongoDB运营商倾向于遵循Unix哲学

做一件事并做得好

因此每个操作员只应执行一项任务.

为什么/何时$currentDatenew Date

首先,我想提一下这new Date是一个JavaScript Date实例.

$currentDate并且new Date可以在要将字段的值更新为当前日期时使用,但new Date需要使用其他更新运算符才能使用.例如:

不同的是$currentDate,new Date可以使用insert方法和值可以设置为特定的,如果Date调用多于on参数.

  • 仍然.如果您的分布式应用程序连接到您的replicaSet /分片集群,每秒插入大量文档,您希望createdAt字段保持一致,并且在Insert上使用$ currentDate将是更好的解决方案.如果你没有高插入音量upsert和插入可能是相同的,但他们实际上不是.Upsert较慢,当您使用**new Date**时,您将从客户端计算机获取日期而不是从数据库服务器获取日期,因此在使用createdAt进行排序时,您很容易出现不一致. (4认同)
  • 不是@ user3100115,我知道`$ currentDate`只能用**更新**而不是插入.我的意思是,在**插入**上使用`$ currentDate`运算符是一个很好的功能.就像任何RDMS在**插入**上都有`now`功能一样**例如,一个用于字段**createdAt**以便知道创建记录的精确时刻. (3认同)

小智 5

您可以从在插入操作中创建的自动生成的“ _id”中检索时间戳。

http://api.mongodb.com/java/current/org/bson/types/ObjectId.html

只需使用方法:ObjectId.getTimestamp()。

时间戳粒度以秒为单位。