mongodb插入创建时间与objectId分开

问题描述 投票:0回答:3

我正在使用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;}}
}
mongodb mongodb-.net-driver
3个回答
0
投票

你可以有一个_id本身就是一个文件:

in json : { _id : {guid : ...., createdOn : ....} , field1 : ..., field2:....}

您只需修改idGenerator即可获得此行为。

但是,我建议您重新考虑使用ObjectId。


2
投票

重要的是它是插入的时间戳而不是对象的创建时间戳吗?如果没有,那么在类的构造函数中执行它。或者甚至更好,是您班级的基础班级。

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
{

}

这是你可以使用的东西吗?


0
投票

如果您试图使您的域图层纯净且没有持久性问题,那么在决定创建实体时,在域层中自己填充创建日期是有意义的,而不是依赖于数据库技术来放入服务器时间戳。

这使得“创建日期”成为逻辑域概念,而不是DB的“首次存储在DB中时的时间戳”概念。两者可以不同,例如在迁移数据(但保持时间戳)的情况下,推迟执行(例如在工作中)等。

它还在“物理时间戳”和“逻辑时间戳”之间创建了一个健康的分离,您可以在测试/模拟过程中进一步利用它(例如,您可以进行测试,说“执行X,然后将逻辑时间更改为将来的2天,然后断言Y“)。

最后,它会强制您考虑创建日期在域层中的含义,而不是盲目地假设它是正确的。

所有这些都说,如果你坚持在MongoDB中使用它,你可以有一个映射,在插入时将ObjectID创建到某种隐藏字段(例如显式实现的接口),并在读取时将其时间戳提取到CreationDate字段中时间。

© www.soinside.com 2019 - 2024. All rights reserved.