Meteor中自动createdAt和updatedAt字段

时间:2014-03-18 09:08:19

标签: javascript node.js mongodb meteor

在我的收藏中,我希望自动生成createdAtupdatedAt字段,其中包含最后一次插入/更新对象的日期 - 有点喜欢它#39;发生在Ruby on Rails上。目前我正在与一个类似于此的观察者这样做:

MyCollection.find({}).observeChanges({
  changed: function(id, changes) {
    MyCollection.update(id, ...);
  },
});

是否有更好/更有效/更直接的方式?

2 个答案:

答案 0 :(得分:5)

我使用Collection2。它支持模式中的autoValue,这是一个计算字段强制值的函数。由于这两个字段用于所有集合,您可以将它们保存到变量:

@SchemaHelpers =
  createdAt:
    type: Date
    autoValue: ->
      if @isInsert
        return new Date
      if @isUpsert
        return $setOnInsert: new Date
      if @isUpdate
        @unset()
        return
  updatedAt:
    type: Date
    autoValue: ->
      return new Date

然后在集合中:

Schema = {}
Posts = new Meteor.Collection("posts")
Schema.Posts = new SimpleSchema
  createdAt: SchemaHelpers.createdAt
  updatedAt: SchemaHelpers.updatedAt
  title:
    type: String
    max: 30
  body:
    type: String
    max: 3000
Posts.attachSchema(Schema.Posts)

这个解决方案使updatedAt始终存在,当它刚刚插入时,它的值将非常接近createdAt(不一定相同)。如果您在插入时需要设置updatedAt,则可以使用Collection2 readme中的示例:

updatedAt: {
  type: Date,
  autoValue: function() {
    if (this.isUpdate) {
      return new Date();
    }
  },
  denyInsert: true,
  optional: true
},

但这不会处理upserts。我不知道任何正确处理upserts的好解决方案,并且在插入时将字段留空。

答案 1 :(得分:2)

我喜欢https://github.com/matb33/meteor-collection-hooks

collection.before.insert (userId, doc) ->
  doc.createdAt = new Date().valueOf #toISOString()