MongoDB:insertOne()设置时间戳替代new Date(),insert()中$currentDate失效求助
解决MongoDB insertOne()中生成数据库端时间戳的问题
首先明确:你用的$currentDate是更新操作符,只能在updateOne()、updateMany()这类更新操作里生效,直接放在insertOne()的文档参数里,MongoDB只会把它当作普通字段存储,不会执行对应的逻辑。
要实现类似PostgreSQL中NOW()的数据库端时间戳生成,有两种靠谱的方法:
方法1:给字段设置默认值(推荐)
直接在集合上指定time字段的默认值为数据库当前时间,插入时无需手动指定该字段,MongoDB会自动填充:
创建集合时设置默认值
db.createCollection("your_collection_name", { fields: { time: { default: new Date() } } })
修改已有集合的默认值
如果集合已经存在,用collMod命令修改:
db.runCommand({ collMod: "your_collection_name", fields: { time: { default: new Date() } } })
之后插入文档时,只需要传入其他字段即可:
db.your_collection_name.insertOne({ content: "test data" })
插入后的文档会自动带上time字段,值为数据库服务器的当前时间。
方法2:用updateOne()的upsert模式结合$currentDate
如果不想设置集合默认值,可以通过upsert: true实现插入时触发$currentDate:
db.your_collection_name.updateOne( { _id: ObjectId() }, // 用唯一的查询条件,确保不会匹配到已有文档 { $set: { content: "test data" }, // 你的其他字段 $currentDate: { time: { $type: "timestamp" } } }, { upsert: true } )
因为查询条件(这里用新生成的ObjectId)肯定匹配不到已有文档,MongoDB会自动插入新文档,同时执行$currentDate生成数据库端的时间戳。
注意:如果你需要的是Date类型而非时间戳,也可以简化$currentDate的写法:$currentDate: { time: true },这样会直接生成ISODate类型的值。
内容的提问来源于stack exchange,提问作者Vinay Kumar
相关产品推荐
相关产品推荐

