我正在尝试从mysql迁移到Mongodb,并希望像在Mysql中使用NOW()一样插入当前日期, 有没有人知道1行解决方案或我应该用PHP做? 感谢
答案 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),可用于将字段设置为日期或时间戳