MongoDB中是否有NOW()的等价物

时间:2013-12-16 20:35:33

标签: mongodb

我正在尝试从mysql迁移到Mongodb,并希望像在Mysql中使用NOW()一样插入当前日期, 有没有人知道1行解决方案或我应该用PHP做? 感谢

4 个答案:

答案 0 :(得分:7)

获取文档创建的时间戳

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

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

更新日期/时间戳

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

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

答案 1 :(得分:5)

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

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

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

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

答案 2 :(得分:3)

长期以来一直在研究这个问题,并发现这似乎有效:

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

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

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

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

答案 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),可用于将字段设置为日期或时间戳