Время создания вставки mongodb отделено от objectId - PullRequest
0 голосов
/ 15 ноября 2011

Я использую mongodb с официальным драйвером c #.

Я использую Guids в качестве поля Id для своих объектов. Я не хочу вводить зависимость от классов bson mongodb, поэтому я не использую ObjectId в своем доменном слое.

Можно ли поручить mongodb вставлять метку времени создания в объекты, которые я вставляю в хранилище данных?

Пример:

public class Foo
{
    public Guid Id {get;set;}
    public DateTime CreatedOn {get;set;}
}

Используя mongodb idGenerators, я могу получить направляющие, генерируемые при вставке. Я знаю, что в ObjectId есть временная метка, но, как уже упоминалось, я бы не хотел, чтобы мой класс выглядел так

public class Foo
{
    public ObjectId Id { get; set; }
    public DateTime CreatedOn {get { return Id.CreationTime;}}
}

Ответы [ 3 ]

2 голосов
/ 21 ноября 2011

Важно ли, чтобы это была вставленная отметка времени, а не созданная отметка времени объекта? Если нет, то сделайте это в конструкторе класса. Или, что еще лучше, базовый класс для вашего класса (классов).

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 голосов
/ 02 февраля 2014

Если вы пытаетесь сделать свой доменный уровень чистым и свободным от проблем постоянства, то имеет смысл заполнить дату создания самостоятельно в доменном слое , когда вы решите создать объект, а неполагаясь на технологию базы данных, чтобы поставить метку времени сервера.

Это делает «дату создания» концепцией логической области, а не концепцией БД «отметка времени при первом сохранении в БД».Они могут различаться, например, в случаях переноса данных (но с сохранением отметки времени), отсрочки выполнения (например, в заданиях) и т. Д.

Это также создает здоровое разделение между «физической отметкой времени» и «логической отметкой времени», котораявы можете в дальнейшем использовать его во время тестирования / насмешки (например, у вас может быть тест, который говорит: «сделай X, затем измени логическое время на 2 дня в будущем, затем утверждай Y»).

Наконец, это заставляет васдумать о том, что означает дата создания в вашем доменном слое, а не слепо предполагать, что она будет правильной.

Все это, как говорится, если вы настаиваете на наличии его в MongoDB, у вас может быть отображение, которое создает ObjectID в некое скрытое поле (например, явно реализованный интерфейс) во время вставки и извлекает его метку временив поле CreationDate во время чтения.

0 голосов
/ 15 ноября 2011

Вы можете иметь _id, который сам по себе является документом:

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

Вы просто должны изменить свой idGenerator, чтобы иметь такое поведение.

Тем не менее, я рекомендую вам действительно пересмотреть использование ObjectId.

...