【问题标题】:Insert field with $currentDate to MongoDB collection in Meteor将带有 $currentDate 的字段插入 Meteor 中的 MongoDB 集合
【发布时间】:2015-07-24 03:22:59
【问题描述】:

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

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

示例

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

笔记/想法/TL,DR

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

【问题讨论】:

    标签: javascript mongodb meteor mongodb-query


    【解决方案1】:

    虽然我完全理解这种设计非常有意义,但有一个论点,也许是一个不好的论点,即您希望在插入文档时将updated_at 字段设置为合理的值。您可能想要这样做的一个原因是避免总是需要查询两个字段来获取最后更新时间。就像我说的,这可能是一个糟糕的juju,但你去吧。

    无论如何,我能想到的最好的方法是执行一个upsert 过滤not the empty filter。这保证了upsert 始终是insert

    只是对 MongoDB 开发人员的一个小评论。作为一个从事数据库工作的年头比他们想记住的还要长的人,让我了解应该如何在 MongoDB 中正确处理时间戳:

    created_at => _id.Timestamp
    updated_at => $currentDate()
    

    花了我太多时间。也许这是我的错,可能是,但我认为大多数人可能想要/需要做的事情,作为一个概念,它可以更好地解释。如果您四处搜索,您会发现很多不好/错误的信息,因为我很确定这是这样做的方法,而且……互联网对此远未达成共识(尽管我现在是)。

    我不知道,也许这是一个测试。也许这是你在招聘 MongoDB 开发人员时问别人的第一件事:你如何做时间戳?好吧,这就是我要问的问题,因为如果你知道你可能已经在那个阶段学习了大部分 API。

    【讨论】:

      【解决方案2】:

      $currentDate 在 $update 构造中使用时可用于插入不预先存在于文档中的字段。

      引用 Mongodb 3.4 的文档: 行为

      If the field does not exist, $currentDate adds the field to a document.
      

      【讨论】:

        【解决方案3】:

        如果你在集合模型中使用 autoValue 会变得更简单

        createdAt:
        type: Date
        autoValue: ->
          if this.isInsert
            return new Date
          else if this.isUpsert
            return $setOnInsert: new Date
          else
            this.unset()
        

        在插入或更新数据时会自动设置日期

        【讨论】:

          【解决方案4】:

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

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

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

          时间戳粒度以秒为单位。

          【讨论】:

            【解决方案5】:

            如果确实是这样,那么拥有一个仅适用于更新的运算符有什么意义?

            $currentDate 是一个update operator,因此您不能将它与collection.insert 方法一起使用。但是当upserttrue 时,当没有文档与查询条件匹配时,它将创建一个新文档。 MongoDB 运营商倾向于遵循Unix philosophy

            做一件事并把它做好

            所以每个操作员应该只执行一项任务。

            为什么/何时$currentDate 优于 new Date

            首先我想提一下new Date 是一个JavaScript Date 实例。

            $currentDatenew Date 可以在您想将字段的值更新为当前日期时使用,但对于new Date,您需要使用另一个update operator 才能使其工作。例如:

            • 使用new Date

              db.collection.update({ "name": "bar" }, { "$set": { "date": new Date() }})
              
            • 使用$currentDate

              db.collection.update({ "name": "bar"}, 
                  { "$currentDate": { "date": { "$type": date }}}
              )
              

            $currentDate 不同,new Date 可以与insert 方法一起使用,并且如果Date 的调用带有多个参数,则可以将值设置为特定值。

            【讨论】:

            • 静止。如果您有一个分布式应用程序连接到您的副本集/分片集群,每秒插入大量文档,您希望 createdAt 字段保持一致,并且在 Insert 上使用 $currentDate 将是一个更好的解决方案。如果您的插入量不高,则 upsert 和 insert 对您来说可能是相同的,但实际上并非如此。 Upsert 速度较慢,当您使用 new Date 时,您从客户端计算机而不是从数据库服务器获取日期,因此在按 createdAt 排序时容易出现不一致。
            • @MestreSan $currentDate 仅适用于 updateOneupdateMany。不是insert。当您在评论中说 insert 时,也许您的意思是 update
            • 没有@user3100115,我知道$currentDate 只使用更新 而不是插入。我的意思是在inserts 上提供$currentDate 运算符将是一个很好的功能。就像任何 RDMS 都在 inserts 上提供 now 函数一样,例如,可以在字段 createdAt 上使用以了解创建记录的确切时间。
            • @MestreSan 查看我对这个问题的回答,这可能是您所说的解决方案:stackoverflow.com/a/37061284/2911851
            • 是否可以将 $currentDate 与 $setOnInsert 运算符一起使用。这将允许 upsert\insert 设置“创建”日期,而不会每次 upsert\update 都覆盖它。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-12
            • 1970-01-01
            • 2018-02-12
            • 1970-01-01
            • 2015-01-05
            • 2015-12-24
            相关资源
            最近更新 更多