【问题标题】:Is there any Equivalent of NOW() in MongoDBMongoDB 中是否有 NOW() 的等价物
【发布时间】:2014-01-04 09:38:05
【问题描述】:

我正在尝试从 MySQL 迁移到 MongoDB,并希望像在 MySQL 中使用 NOW() 一样插入当前日期。有谁知道 1 行解决方案,还是我应该用 PHP 来做?

【问题讨论】:

  • 只需插入当前 PHP 日期(google for php 获取当前时间)?只是推测,没有使用PHP,但是MongoDB驱动程序应该为MongoDB(和返回)转换PHP日期。
  • 看来只能这样了。 MongoDB 的驱动程序不提供 NOW() 函数。
  • 该函数与 PHP 日期/时间函数有何不同?但我认为你可以让 MongoDB 在服务器上执行任何 javascript,如果你想要服务器时间(我不知道确切地说,文档应该告诉......)。
  • 我没说不一样但是是Mysql自己的函数,不能在服务器上使用Javascript我用的是PHP的MONGODB驱动,不是SHELL/Python脚本。
  • 您可以使用 PHP 驱动程序在服务器上运行 javascript,尽管您通常不应该看起来。 stackoverflow.com/a/11798227/1717300

标签: mongodb


【解决方案1】:

MongoDB 4.2 中的新功能。您可以使用 NOW 获取当前日期时间值。

用例:访问变量,以$$为前缀并用引号括起来。

db.students.updateOne( { _id: 3 }, [ { $set: { "test3": 98, modified: "$$NOW"} } ] )

此外,CLUSTER_TIME 将返回当前时间戳值,但仅适用于副本集和分片集群。

【讨论】:

    【解决方案2】:

    已经研究了很长时间,发现这似乎有效:

    db.a.findAndModify({
      query: { _id: { $lt: 0 } },
      update: { $currentDate: { dateField: true } },
      upsert: true,
      new: true // optional
    });
    

    奇怪的查询部分背后的想法是它总是返回“未找到”,因此它总是创建文档(upsert: true),但也不将其用作新插入文档的值(例如, 在查询中使用 { _id: 0 } 实际上会插入一个 _id 字段值为 0) 的文档。

    使用批量可以采取类似的方法:

    var aBulk = db.a.initializeUnorderedBulkOp();
    aBulk
      .find({ _id: { $lt: 0 } })
      .upsert()
      .updateOne({
        $currentDate: { dateField: true }
      });
    aBulk.execute();
    

    【讨论】:

    • 或者使用在客户端为{_id: newId}生成的ObjectId——这样新的文档就会使用这个id创建。
    【解决方案3】:

    在插入时,如果您在前 2 个字段之一中插入 BsonTimeStamp(0,0),服务器将替换为服务器上的当前时间戳。

    $ts = new MongoTimestamp(0, 0);
    $document = array("_id" => 1, "s" => 1, "ts" => $ts);
    $coll->insert($document);
    $document = array("_id" => 2, "ts" => $ts, "s" => 2);
    $coll->insert($document);
    $document = array("ts" => $ts, "_id" => 3, "s" => 3);
    $coll->insert($document);
    

    _id 为 2 和 3 的文档将在 ts 字段中插入当前时间戳。

    > db.timestamp.find()
    { "_id" : 1, "s" : 1, "ts" : Timestamp(0, 0) }
    { "_id" : 2, "ts" : Timestamp(1387236748, 1), "s" : 2 }
    { "_id" : 3, "ts" : Timestamp(1387236748, 2), "s" : 3 }
    

    此外,对于服务器 2.5.3(将作为 2.6 发布),您有一个新的 $currentDate 更新已修改 (https://jira.mongodb.org/browse/SERVER-10911),可用于将字段设置为日期或时间戳

    【讨论】:

    • 由于许多驱动程序不保留对象中字段的顺序,因此这种方法可能很难依赖。位置时间戳行为是复制的历史内部实现的副作用,因此在 MongoDB 的未来版本中可能无法按预期工作。
    【解决方案4】:

    获取文档创建时间戳

    如果您将 MongoDB 的 default ObjectIDs 用于您的 _id 字段,其中包括一个时间戳组件,您可以使用它来推断文档的创建日期。 PHP 驱动程序包含一个MongoId::getTimestamp() 方法,可用于从 ObjectID 中提取时间。

    请注意,ObjectID 通常由 PHP 驱动程序(而不是 MongoDB 服务器)生成,因此如果时间戳准确性很重要,请务必让您的时钟与 ntpd 或类似名称同步。

    更新日期/时间戳

    在即将发布的 MongoDB 2.6 版本中,添加了一个新的 $currentDate 更新修饰符,它支持设置服务器端日期和时间戳。有关更多信息,请参阅:MongoDB Jira 问题跟踪器中的SERVER-10911

    在此服务器端支持可用之前,添加当前日期/时间的最佳方法是使用 time() 或等效函数在应用程序代码中进行设置。

    【讨论】:

    • 太棒了!我只需要找出如何获取 _id 值,我想我读过一些关于如何在插入时访问这个值的内容!非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2013-06-21
    • 2014-01-09
    • 2012-02-18
    • 2014-05-02
    • 1970-01-01
    相关资源
    最近更新 更多