Правильное использование / обработка 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) был единственным способом заставить это работать.


используйте в запросе следующий синтаксис:

{
    "StartDateTime.0": {
        "$gte": 635052168609734070
    }
}