это может быть эффективным в зависимости от того, что вы должны делать чаще. Структура сама по себе в порядке. Вы всегда получаете все посещения для одного посетителя «бесплатно», когда вы запрашиваете посетителя - это самое большое преимущество, поэтому все посещения для одного посетителя довольно легко. Это также означает, что вам не нужна коллекция посещений, которая очищает вашу схему.
Вот примеры реализаций необходимых вам операций:
Добавление посещения:
db.visitors.update({_id:<visitorId>}, {$push:{visits:<newVisit>}})
Удаление посещения:
db.visitors.update({_id:<visitorId>}, {$pull:{visits:{visitId:<visitId>}})
Если вы имели в виду отображение всех посещений всех посетителей вместе, то прямого способа сделать это в настоящее время нет. Вы можете сделать это с помощью отдельной операции и некоторой логики приложения, чтобы развернуть отдельные массивы или использовать m / r. В 2.2. будет структура агрегации, которая прекрасно справится с этой задачей.
Есть несколько вещей, которые следует учитывать:
- Документы имеют ограничение в 16 МБ. Если у вас может быть достаточно посещений, чтобы достичь этого ограничения, вам потребуется отдельная коллекция посещений.
- Запросы на некоторые посещения определенного посетителя невозможны. Вы всегда запрашиваете документы верхнего уровня, поэтому, если у пользователя 14 000 посещений, и вам нужно только определенное число, вам потребуется получить весь документ. Для подкачки страницы это можно сделать с помощью $ slice.
- Изменение нескольких посещений для одного посетителя с одним обновлением может быть сложным без отдельной коллекции посещений. Вы можете адресовать только один элемент массива за обновление через позиционный оператор $.
Надеюсь, это поможет.