Правильное использование / обработка DateTimeOffset в MongoDB
public class ScheduledEvent : Event
{
public DateTimeOffset StartDateTime { get; set; }
}
StartDateTime = 5/27/2013 2: 09:00 AM +00:00 представляя 05/26/2013 07: 09 PM PST
что записано в MongoDB:
> db.ScheduledEvent.find().toArray()
[
{
"_id" : BinData(3,"ZE2p31dh00qb6kglsgHgAA=="),
"Title" : "Today 26th at 7:09pm",
"Length" : "00:00:00",
"MoreInformation" : "http://1.com",
"Speakers" : [
{
"_id" : BinData(3,"ndzESsQGukmYGmMgKK0EqQ=="),
"Name" : "Mathias Brandewinder"
}
],
"Location" : {
"_id" : BinData(3,"AAAAAAAAAAAAAAAAAAAAAA=="),
"Name" : "Somwhere "
},
"Organizers" : [
{
"_id" : BinData(3,"AAAAAAAAAAAAAAAAAAAAAA=="),
"Name" : null
}
],
"CreatedOn" : [
NumberLong("635052144104050898"),
0
],
"StartDateTime" : [
NumberLong("635052173400000000"),
0
]
}
]
Я понимаю, что StartDateTime хранится как Тики в MongoDB.
var dateMarker = DateTimeOffset.UtcNow;
var nextDay = dateMarker.AddDays(1);
этот запрос не работает:
var today = EventRepoistory.All().Where(z => z.StartDateTime >= dateMarker && z.StartDateTime < nextDay).OrderByDescending(z => z.StartDateTime).ToList();
я добавил отображение запроса к драйверу Mongo C#, который показывает следующий запрос:
{ "$query" : { "StartDateTime" : { "$gte" : [NumberLong("635052168609734070"), 0], "$lt" : [NumberLong("635053032609734070"), 0] } }, "$orderby" : { "StartDateTime" : -1 } }
нижняя граница = 6350521 68609734070
сервер = 6350521 73400000000
верхняя граница = 6350530 32609734070
вопрос: почему запрос MongoDB ничего не возвращает?
db.ScheduledEvent.найти ({"$query": {"StartDateTime": {"$gte": [NumberLong("635052168609734070"), 0], "$lt": [NumberLong("635053032609734070"), 0] } }, "$orderby": {"StartDateTime": -1 } })
исследованы:
в MongoDB и DateTimeOffset тип но это швы, что поставщик LINQ делает то, что он должен?
пробовал:
db.ScheduledEvent.find({ "StartDateTime" : { "$gte" : [NumberLong("1"), 0] } } )
не дает результата.
2 ответов
подобный ответ можно найти здесь: MongoDB и тип DateTimeOffset (как вы заметили в своем вопросе)
Я получил эту работу с драйвером C#, выполнив следующее:
var query = Query.GT("StartDateTime.0", startDate.Ticks);
var json = query.ToJson();
производит этот JSON:
{ "StartDateTime.0" : { "$gt" : NumberLong("635251617859913739") } }
вышеупомянутый JSON работает. В связанном ответе причина заключается в том, что DateTimeOffset является массивом.
когда я использую LINQ, я получаю (как вы отметили) другой результат для JSON.
var query = from r in col.AsQueryable<MyObjectType>()
where r.StartDateTime>= startDate && r.StartDateTime< endDate
select r;
запрос LINQ выше выводится следующий JSON:
{ "StartDateTime" : { "$gte" : [NumberLong("635251617859913739"), 0], "$lt" : [NumberLong("635251635859913739"), 0] } }
Я не уверен, что поставщик LINQ в драйвере c# должен быть исправлен для обработки DateTimeOffset, но с помощью построителя запросов для указания первого элемента массива DateTimeOffset (StartDateTime.0) был единственным способом заставить это работать.