Время создания вставки mongodb отделено от objectId

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

Я использую Guids в качестве поля идентификатора для своих объектов. Я не хочу вводить зависимость от классов 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;}}
}

person JB.    schedule 15.11.2011    source источник
comment
Не могли бы вы объяснить свой отказ от использования класса bson?   -  person kamaradclimber    schedule 15.11.2011
comment
Можно сказать, что я пытаюсь сохранить чистоту своего доменного уровня. Под этим я подразумеваю то, что мне не нужны какие-либо зависимости от сторонних библиотек (кроме .NET) на моем уровне домена. Таким образом, я могу свободно перемещать уровень домена между технологиями сохранения. Если я включу тип ObjectId, я не смогу сделать это без некоторых усилий.   -  person JB.    schedule 16.11.2011


Ответы (3)


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

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

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

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

person kamaradclimber    schedule 15.11.2011
comment
Несмотря на то, что я сказал в своем комментарии, я могу просто использовать ObjectId для простоты (пока не уверен). Однако я все еще удивлен, что для получения автоматически созданной метки времени из базы данных мне нужно использовать тип Id. - person JB.; 16.11.2011
comment
Если вы хотите иметь метку времени, вы можете сгенерировать ее из кода. Как я сказал - person kamaradclimber; 16.11.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
{

}

Это то, что вы можете использовать для этого?

person Paw Baltzersen    schedule 21.11.2011
comment
Извините, если код на самом деле не компилируется, я не за банкоматом своего компьютера разработчика. - person Paw Baltzersen; 21.11.2011

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

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

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

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

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

person Avish    schedule 02.02.2014