如何在Mongoose中设置upsert操作的更新时间戳?

时间:2013-02-04 19:07:39

标签: node.js mongodb mongoose upsert

我想设置更新时间戳,仅用于在 upsert 操作中更新记录(并插入新记录的时间戳)。

self.model.update({Id: obj.Id}, obj, {upsert: true}, function(err){
    if (err) {
        return;
    }

    //...

});

无论如何都要处理这个问题?

我可以使用 pre.save 中间件,但有什么方法可以判断当前操作是插入还是更新?

提前致谢!

4 个答案:

答案 0 :(得分:3)

你不能自动完成。你可以在upsert上使用$set: { timestamp: Date.now() }来完成。

在mongoose bugtracker中有一个封闭的问题,在这里讨论:defaults are ignored on upsert

有点晚了,但希望能帮助别人!

答案 1 :(得分:0)

你可以使用预保存挂钩,你可以使用.isNew或.isModified等多个标志。

self.schema.pre('save', function (next) {

  if (this.isNew) {
    this.updated = Date.now();
  }
  return next();
}

对于创建日期,可以从ObjectId

中提取时间戳

答案 2 :(得分:0)

用于插入

db.test.insert({ts:new Date()})

for upsert

db.test.update({"_id" : ObjectId("540815fa802a63ddca867bc0")},{$set:{ts:new Date()}},{upsert:1})

答案 3 :(得分:0)

有一个mongoose插件。(Mongoose Timestamps插件)

以下是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 timestamps

就是这样!

这将添加created_at并在您继续使用“model.save()”时保持update_at更新