Вы описали два метода, позвольте мне разбить их.
Метод № 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 элементов, вы получите их все для каждого соответствующего документа. Есть способы отфильтровать возвращаемые поля, но они не работают для «массивов объектов».