Вопрос по spring-data, mongodb-java, mongodb, mongodb-query – Spring-Data mongodb запрашивает несколько классов, хранящихся в одной коллекции

5

В Spring-Data вы можете использовать аннотацию @Document, чтобы указать, в какую коллекцию сохранить объект. Скажем, у меня есть два класса, ученик и учитель, оба сохранились в коллекции людей. Когда я выполняю следующий код:

<code>mongo.find(new Query(), Teacher.class);
</code>

результат содержит как ученика, так и учителя. Просматривая данные, созданные Spring-Data, каждый документ содержит & quot; _class & quot; поле, которое указывает, от какого класса он сохраняется.

Это поле не используется в поиске в качестве фильтра для возврата только учителя? Как я могу запросить только Учителя, кроме этого:

<code>mongo.find(new Query().addCriteria(where("_class").is(Teacher.class.getCanonicalName()), Teacher.class);
</code>

Ваш Ответ

2   ответа
1

как оформить свои коллекции. Поскольку Mongo ничего не знает о типах, мы должны добавить дополнительные метаданные, чтобы различать документы друг от друга. Таким образом, при запросе вам также необходимо добавить эти ограничения в запрос. Обратите внимание, что вы можете обратиться к_class ключ черезDefaultMongoTypeMapper.DEFAULT_TYPE_KEY.

Мы подумали о добавлении некоторого API в запрос, чтобы выразить желание получить только документы определенного типа, например:

mongo.find(new Query(Teacher.class), Teacher.class);

Все еще кажется немного странным, что вам нужно дважды указывать класс домена (что имеет смысл, если вы хотите ограничить результаты документами определенного типа, но сопоставить их с другим классом). Кроме того, мы могли ограничить результаты только документами, которые содержатexactly that type, поскольку типы хранятся в виде Strings, а наследование может применяться только в том случае, если класс уже загружен. Так что при запросе документов с типомPerson мы должны загрузитьall сначала попробуйте найти тип, проверить тип и, возможно, отбросить результат, который не оптимален по соображениям производительности.

Другой вариант - хранить все типы, которым может быть назначен класс (почти все интерфейсы и суперклассы, кромеObject может быть) но это может привести к сохранению большого количества данных. Это может быть в свою очередь достигнуто путем добавления флага к@Document аннотаций.

Итог: в настоящее время нет другого пути, кроме как свободно поднимать билеты JIRA, если у вас есть предложения, как это можно улучшить.

Спасибо Оливер, я подниму билет, если найду хорошее решение. ltfishie
Да, но это не касается вашего сценария. Билет охватывает возможность хранитьPerson а такжеTeacher внутри той же коллекции и возможность запрашивать объекты из нее и получитьPerson а такжеTeacher экземпляр (отсюда и необходимая информация о типе). На самом деле он не рассматривает возможность улучшения только чтенияTeacher Объекты & Quot; сценарий.
Проходя через mongodb Jira, я наткнулся на этот билетjira.springsource.org/browse/DATAMONGO-128 который является фиксированным на 1.0.M3. Это все еще в источнике? ltfishie
2

query.restrict(Teacher.class,Teacher.class);
Предоставление более подробной информации о предлагаемом ответе было бы очень полезно для ОП
Отлично, спасибо.

Похожие вопросы