MongoDB - возможно ли выполнить запрос по ключу ассоциативного массива? - PullRequest
6 голосов
/ 01 марта 2012

Мне нужно хранить некоторые данные, которые, по сути, представляют собой просто массив пар ключ-значение даты / целые, где даты всегда будут уникальными.

Я хотел бы иметь возможность хранить их какассоциативный массив:

array(
    "2012-02-26" => 5,
    "2012-02-27" => 2,
    "2012-02-28" => 17,
    "2012-02-29" => 4
)

, но я также должен иметь возможность запрашивать даты (т.е. получить все, где дата> 2012-02-27), и поэтому подозреваю, что мне нужно будет использоватьсхема больше похожа на:

array(
    array("date"=>"2012-02-26", "value"=>5),
    array("date"=>"2012-02-27", "value"=>2),
    array("date"=>"2012-02-28", "value"=>17),
    array("date"=>"2012-02-29", "value"=>4),
)

Очевидно, что первая намного чище и более краткая, но я смогу запросить ее так, как я хочу, и если нет, то есть ли другие схемы, которые могут бытьбольше подходит?

1 Ответ

10 голосов
/ 01 марта 2012

Вы описали два метода, позвольте мне разбить их.

Метод № 1 - Ассоциативный массив

Ключевым инструментом для запросов по «ассоциативному массиву» является оператор $exists. Здесь - подробности об операторе.

Так что вы определенно можете выполнить запрос, подобный следующему:

db.coll.find( { $exists: { 'field.2012-02-27' } } );

Исходя из вашего описания, вы ищете диапазонные запросы, которые не очень хорошо соответствуют оператору $exists. Версию «ассоциативного массива» также сложно проиндексировать.

Метод № 2 - Массив объектов

Это определенно имеет лучшую функциональность запросов:

db.coll.find( { 'field.date': { $gt: '2012-02-27' } } );

Может также индексироваться

db.coll.ensureIndex( { 'field.date': 1 } );

Однако при обновлении существует компромисс. Если вы хотите увеличить значение на определенную дату, вы должны использовать этот громоздкий $ позиционный оператор. Это работает для массива объектов, но не для чего-либо с дальнейшей вложенностью.

Другие вопросы

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

В том же духе запросы MongoDB всегда возвращают объект верхнего уровня. Опять же, если у вас есть массив из 700 элементов, вы получите их все для каждого соответствующего документа. Есть способы отфильтровать возвращаемые поля, но они не работают для «массивов объектов».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...