У меня есть база данных MongoDB, в которой хранятся записи, имеющие временную метку, когда они были созданы, и значение. Я подключаюсь к этой базе данных и запрашиваю ее с помощью официального драйвера C#.Получить ближайшие значения за пределами диапазона запросов
Обычный случай использования включает в себя получение всех записей> = startDateTime и < = endDateTime, что довольно прямолинейно.
Однако есть моменты, когда точки данных достаточно далеки от начала и конца периода, который мне понадобится для интерполяции значения в startDateTime и endDateTime. Для этого мне, очевидно, нужна последняя запись перед startDateTime и первая запись после endDateTime. Это легко сделать с тремя запросами, но я бы хотел избежать этого, чтобы сократить количество обращений в базу данных.
Можно ли достичь этого одним запросом?
Edit: так как меня попросили уточнить случай использования:
у меня есть датчик, который регистрирует температуру каждый час. Температура и временная метка сохраняются в коллекции MongoDB. Теперь я хочу составить график температур за вчерашний день, поэтому я прошу записать все записи, имеющие временную метку> = 2014.02.04 00:00:00 и временную отметку < 2014.02.05 00:00:00
Это оказывается, что этот датчик регистрируется через 55 минут в каждый час, поэтому моя первая точка данных составляет 55 минут, а мой последний пункт данных находится в 5 минутах от конца вчера.
В дополнение к 24 значениям, которые относятся к моему временному диапазону, я хотел бы получить значения в 2014.02.03 23:55:00 и в 2014.02.05 00:55:00, чтобы я мог интерполировать. Это необходимо обобщить на получение последней записи до начала моего периода и первой записи после окончания моего периода, так как я не знаю, как часто регистрируется журнал регистрации, когда он регистрируется, или если он находится в автономном режиме в любой момент.
Edit2: сокращенный вариант моего кода, как сегодня:
//Get last record before the period
var cursor = collection.Find(
Query.LT("DateTime", startDateTime)
);
cursor.Limit = 1;
cursor.SetSortOrder(SortBy.Descending("DateTime"));
//Not shown: getting the record from the cursor and adding it to the collection
//Getting all records that fall within the specified period
cursor = collection.Find(
Query.And(
Query.GTE("DateTime", startDateTime),
Query.LTE("DateTime", endDateTime))
);
//Not shown: getting the records from the cursor and adding them to the collection
//Get first record after the period
cursor = collection.Find(
Query.GT("DateTime", endDateTime)
);
cursor.Limit = 1;
cursor.SetSortOrder(SortBy.Ascending("DateTime"));
//Not shown: getting the record from the cursor and adding it to the collection
Я никогда не использовал MongoDB. В SQL Server вы можете объединить эти три запроса в один с несколькими UNION. Поддерживает ли MongoDB UNION или эквивалент? – jmcilhinney
Да, я в основном семейный с SQL. Похоже, есть оператор OR, который можно использовать: http://stackoverflow.com/questions/14924129/union-on-same-collection-in-mongodb –
Не уверен, что я понимаю ваш прецедент. Вы говорите, что пытаетесь найти, какие даты начала и окончания использовать для использования в другом запросе? Это может помочь, если вы публикуете информацию о том, что вы на самом деле делаете в своем вопросе, для уточнения. –