在我的收藏中,我希望自动生成createdAt
和updatedAt
字段,其中包含最后一次插入/更新对象的日期 - 有点喜欢它#39;发生在Ruby on Rails上。目前我正在与一个类似于此的观察者这样做:
MyCollection.find({}).observeChanges({
changed: function(id, changes) {
MyCollection.update(id, ...);
},
});
是否有更好/更有效/更直接的方式?
答案 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()