我想设置更新时间戳仅用于在upsert操作中更新记录(并为新记录插入时间戳)。
self.model.update({Id: obj.Id}, obj, {upsert: true}, function(err){
if (err) {
return;
}
//...
});
有没有办法处理这个?
有一个我可以使用的pre.save中间件,但是有没有办法判断当前操作是插入还是更新?
提前致谢!
你不能自动完成。您可以$set: { timestamp: Date.now() }
在 upsert 上使用它。
mongoose bugtracker 中有一个已解决的问题在这里讨论这个问题:upsert 忽略默认值
有点晚了,但希望对某人有所帮助!
为此有一个猫鼬插件。(猫鼬时间戳插件)
这是 CoffeeScript 实现 - 如果需要,可以使用 js2coffe.com 转换为 js。
你可以在你的所有模型中使用它。
创建如下函数
# * Mongoose Timestamps Plugin
# * Copyright(c) 2012 Nicholas Penree <nick@penree.com>
# * Original work Copyright(c) 2012 Brian Noguchi
# * Modified from Fino 2014
# * MIT Licensed
#
timestamps = (schema, options) ->
updated_at = "updated_at"
created_at = "created_at"
updatedAtType = Date
createdAtType = Date
if typeof options is "object"
if typeof options.updated_at is "string"
updated_at = options.updated_at
else if typeof options.updated_at is "object"
updated_at = options.updated_at.name or updated_at
updatedAtType = options.updated_at.type or updatedAtType
if typeof options.created_at is "string"
created_at = options.created_at
else if typeof options.created_at is "object"
created_at = options.created_at.name or created_at
createdAtType = options.created_at.type or createdAtType
dataObj = {}
dataObj[updated_at] = updatedAtType
if schema.path("created_at")
schema.add dataObj
schema.virtual(created_at).get ->
this["_" + created_at] if this["_" + created_at]
return this["_" + created_at] = @_id.getTimestamp()
schema.pre "save", (next) ->
if @isNew
this[updated_at] = this[created_at]
else
this[updated_at] = new Date
next()
return
else
dataObj[created_at] = createdAtType
schema.add dataObj
schema.pre "save", (next) ->
unless this[created_at]
this[created_at] = this[updated_at] = new Date
else
this[updated_at] = new Date
next()
return
return
然后在您的 Mongoose 模型中执行以下操作
userSchema.plugin 时间戳
而已!
当您继续使用“model.save()”时,这将添加 created_at 并保持 update_at 更新
您可以使用预保存挂钩,您可以使用许多标志,例如 .isNew 或 .isModified。
self.schema.pre('save', function (next) {
if (this.isNew) {
this.updated = Date.now();
}
return next();
}
对于创建日期,可以从 ObjectId 中提取时间戳
用于插入
db.test.insert({ts:new Date()})
用于插入
db.test.update({"_id" : ObjectId("540815fa802a63ddca867bc0")},{$set:{ts:new Date()}},{upsert:1})