2016-07-27 90 views
6

我的应用程序使用猫鼬,具有架构某些更新跳过时间戳中间件使用timestamps option在猫鼬

var fooSchema = new Schema({ 
    name: String, 
}, { 
    timestamps: true, 
}); 
mongoose.model('Foo', fooSchema); 

所以每当更新写入到收藏,updatedAt属性更改为当前日期。但是现在我想添加一些变化,应该不是更新updatedAt属性。 Stackoverflow上的一些答案(example)建议使用Foo.collection,因为它涉嫌访问本地MongoDB驱动程序。所以我试过这个:

Foo.collection.update({ _id: someFooId }, { $set: { name: 'New Name' } }); 

但是,这也改变了updatedAt属性。

那么如何更新文档而不是更改updatedAt

+0

我有同样的确切问题。你有没有找到解决方案/解决方法呢? – danii

+1

@danii不幸的是没有。我删除了时间戳中间件,并在必要时手动更新时间戳。 – str

回答

0

我能得到的是你自动更新updated_at字段的日期时间。您必须为模式中的updated_at传递默认值,只需删除该默认字段即可。

例如。

var fooSchema = new Schema({ 
    name: String, 
}, { 
    updated_at:{ 
     type: Date, 
     default: Date.now 
    } 
}); 
mongoose.model('Foo', fooSchema); 

取下updated_atdefault field,你的架构将这个样子。

var fooSchema = new Schema({ 
    name: String, 
}, { 
    updated_at: Date 
}); 
mongoose.model('Foo', fooSchema); 
+0

“您必须为模式中的updated_at传递默认值”否,发布的模式是完整模式。而'Schema'的第二个参数是用于选项,不过'没有'updated_at'选项。 – str

+0

那么如果没有这样的密钥存在,你的'updatedAt'字段如何得到更新? PS。我只把'updated_at'作为参考你的'updatedAt'。 –

+0

请参阅问题中提到的[时间戳选项](http://mongoosejs.com/docs/guide.html#timestamps)。 – str

1

我刚刚发现了一个解决方案,它对我完全起作用。

mongoose.connection.db.collection('player').update(
    {_id: mongoose.Types.ObjectId('56cb91bdc5946f14678934ba')}, 
    {$set: {name: 'Test'}} 
}); 

此查询不会更新updatedAt字段。希望你仍然需要这个!