我正在使用mongodb和官方的c#驱动程序。
我使用Guids作为我的对象的Id字段。我不想引入对mongodb bson类的依赖,所以我没有在我的域层中使用ObjectId。
是否可以指示mongodb将创建时间戳插入到我插入数据存储区的对象中?
例:
public class Foo
{
public Guid Id {get;set;}
public DateTime CreatedOn {get;set;}
}
使用mongodb idGenerators我可以获得插入时生成的Guids。我知道ObjectId包含时间戳,但如上所述,我不希望我的类看起来像这样
public class Foo
{
public ObjectId Id { get; set; }
public DateTime CreatedOn {get { return Id.CreationTime;}}
}
你可以有一个_id本身就是一个文件:
in json : { _id : {guid : ...., createdOn : ....} , field1 : ..., field2:....}
您只需修改idGenerator即可获得此行为。
但是,我建议您重新考虑使用ObjectId。
重要的是它是插入的时间戳而不是对象的创建时间戳吗?如果没有,那么在类的构造函数中执行它。或者甚至更好,是您班级的基础班级。
public abstract class BaseClass
{
[BsonId]
public Guid Id {get;set;}
public DateTime CreatedOn {get;set;}
protected BaseClass()
{
Guid = new Guid();
CreatedOn = new DateTime.UtcNow;
}
}
public class Foo : BaseClass
{
}
这是你可以使用的东西吗?
如果您试图使您的域图层纯净且没有持久性问题,那么在决定创建实体时,在域层中自己填充创建日期是有意义的,而不是依赖于数据库技术来放入服务器时间戳。
这使得“创建日期”成为逻辑域概念,而不是DB的“首次存储在DB中时的时间戳”概念。两者可以不同,例如在迁移数据(但保持时间戳)的情况下,推迟执行(例如在工作中)等。
它还在“物理时间戳”和“逻辑时间戳”之间创建了一个健康的分离,您可以在测试/模拟过程中进一步利用它(例如,您可以进行测试,说“执行X,然后将逻辑时间更改为将来的2天,然后断言Y“)。
最后,它会强制您考虑创建日期在域层中的含义,而不是盲目地假设它是正确的。
所有这些都说,如果你坚持在MongoDB中使用它,你可以有一个映射,在插入时将ObjectID创建到某种隐藏字段(例如显式实现的接口),并在读取时将其时间戳提取到CreationDate字段中时间。