架构:
var schema = new Schema({...}, {
timestamps: true,
id: false,
toJSON: {
virtuals: true,
},
toObject: {
virtual: true,
}
});
schema.virtual('updated').get(function () {
if(typeof this.updatedAt === "undefined" && typeof this.createdAt === "undefined") return "";
var updated = (typeof this.updatedAt === "undefined") ? this.createdAt : this.updatedAt;
return "Updated "+moment(updated).fromNow();
});
此代码 最近正在运行 - 针对特定实例的updatedAt将于8月24日发布,但对文档的任何新修改都不会更新时间戳。
感觉我在这里错过了一些非常愚蠢的东西。
答案 0 :(得分:3)
可以尝试修改您的架构,如:
var schema =new Schema({..},
{ timestamps: { createdAt: 'createdDate',updatedAt: 'updatedDate' }
});
此模式时间戳的将在save()
,update()
和findOneAndUpdate()
上更新。所以不需要schema.virtual('updated')...
<强>过程-2 强>
在您的架构中添加了createdDate
和updatedDate
Date
类型,并使用架构插件更新这些日期字段。
像:
var mongoose = require('mongoose'),
Schema = mongoose.Schema,
SchemaPlugin = require('../helpers/schemaPlugin');
var schema =new Schema({..},
createdDate: {
type: Date,
default: Date.now
},
updatedDate: {
type: Date,
default: Date.now
}
});
schema.plugin(SchemaPlugin);
<{1>}文件中的:
schemaPlugin.js
答案 1 :(得分:1)
updatedAt和createdAt都是在使用mongoose将新文档输入数据库的同时创建的,因此检查updatedAt是否未定义是不合逻辑的,因为在创建新文档时两者都具有相同的值。
每当您使用mongoose更新函数或findByIdAndUpdate或findOneAndUpdate时,updatedAt的值将自动更新。使用Mongongb客户端(如mongochef或robomongo)直接检查updatedAt的值。
答案 2 :(得分:1)
偶然发现同一件事,发现如果用updatedAt
(或findOneAndUpdate()
)更新对象时,如果在我的对象上设置了属性update()
,它将不会更新它。
对于我来说,请确保在更新前未设置updatedAt
来解决此问题:
delete thing.updatedAt;
Thing.findOneAndUpdate(
{ _id : thing._id },
thing,
function (err, result) {
…
答案 3 :(得分:0)
您正在将object
与String
进行比较,这就是为什么条件始终为false
schema.virtual('updated').get(function () {
if(typeof this.updatedAt === undefined && typeof this.createdAt === undefined) return "";
var updated = (typeof this.updatedAt === undefined) ? this.createdAt : this.updatedAt;
return "Updated "+moment(updated).fromNow();
});
试试这个,它应该可行