2012-05-07 6 views
7

Я пытаюсь найти все документы, созданные за указанное время. Я использую C# и драйвер mongodb C#.MongoDB и DateTimeOffset type

Моя сущность заключается в следующем:

public class Entity 
{ 
    public Gid Id { get; private set; } 
    public DateTimeOffset CreationTimestamp { get; private set; } 
    public Entity() 
    { 
    } 
} 

Так я думал, что я мог бы сделать это:

DateTime compareTime = DateTime.UtcNow.AddMinutes(-15); 
var result = _collection.Find(Query.GT("CreationTimestamp", compareTime)).Count(); 

Результат является счетчиком нуля, даже если есть данные в коллекции. Если я перейду с DateTimeOffset в DateTime, я верну результат.

Является ли проблема, что тип DateTimeOffset не поддерживается? Если это так, мне нужно, чтобы мои объекты использовали DateTimeOffset?

+0

Обновлено DateTime.Now.AddMinutes (-15); to DateTime.UtcNow.AddMinutes (-15); – Noel

ответ

11

DateTimeOffset не сериализуется как дата вообще, а (по умолчанию), как массив [тиков, смещение временной зоны]. Таким образом, вы не можете запросить его так же, как и обычную дату. Вместо этого мы будем запрашивать на основе тиков. Вам нужно будет убедиться, что ваши временные смещения одинаковы, иначе это не сработает.

DateTimeOffsett compareTime = DateTimeOffsett.UtcNow.AddMinutes(-15); 
var result = _collection.Find(Query.GT("CreationTimestamp.0", compareTime.Ticks)).Count(); 

В принципе, мы собираемся сравнить первый элемент хранимого массива с количеством тиков. Извините еще раз за время, затраченное на получение этого ответа.

+0

Craig, Когда я использую FindAll(), моя CreationTimestamp, полученная из моего документа, {07/05/2012 16:39:20 +01: 00}. Когда я делаю Query.GT («CreationTimestamp», compareTime) .ToJson(); мое значение - «{\" CreationTimestamp \ ": {\" $ gt \ ": ISODate (\" 2012-05-07T15: 24: 29.037Z \ ")}}« Поэтому я ожидаю, что это вернет документ – Noel

+0

Да Я должен использовать DateTimeOffset – Noel

+0

Хорошо, я обновил ответ. –

Смежные вопросы