#spring #mongodb #spring-data-jpa
#весна #mongodb #spring-data-jpa
Вопрос:
Чтобы улучшить производительность наших запросов и, следовательно, время отклика API, мы создали представления в MongoDB путем агрегирования данных. Однако, когда мы пытаемся использовать представление с использованием шаблона Spring Mongo, сталкиваемся с несколькими проблемами, такими как просмотр, который не поддерживается.
Caused by: com.mongodb.MongoCommandException: Command failed with error 166 (CommandNotSupportedOnView): 'Namespace aiops.hostView is a view, not a collection' on server 192.168.20.166:30011. The full response is {"ok": 0.0, "errmsg": "Namespace aiops.hostView is a view, not a collection", "code": 166, "codeName": "CommandNotSupportedOnView"}
at com.mongodb.internal.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:175)
at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:303)
at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:259)
Поддерживает ли Spring представления MongoDB из коробки? любой пример очень поможет!
Заранее благодарю вас
Комментарии:
1. извините, но как вы создали представление вручную или путем кодирования с помощью spring boot? Я пытался сделать это с помощью mongoTemlate, и мне это не удалось, я использовал MongoTemplate.ExecuteCommand(create: «viewName» , viewOwn: «source» , конвейер: [ pip ] ) Буду признателен за любую помощь.
Ответ №1:
Это несколько устарело, но я оставлю свое решение на случай, если кто-то наткнется на это, как я.
Насколько я знаю, вы не можете использовать обычный подход к данным Spring: вы не можете аннотировать объект @Document(value="YOUR_VIEW_NAME")
аннотацией и создать связанный репозиторий, расширяющий класс MongoRepository.
Но вы можете запросить представление непосредственно из MongoTemplate, передав имя вашего представления.
Допустим, у вас есть объект User, определенный следующим образом:
public class User {
@Id
String id;
String name;
}
Затем вы можете сопоставить их с документами представления с именем «userview» и запросить его следующим образом:
Query query = new Query();
query.addCriteria(Criteria.where("name").is("Bob"));
// template is an object of class MongoTemplate that you can inject or autowire
List<User> users = template.find(query, User.class, "userview");
Ответ №2:
Недавно я столкнулся с той же проблемой, то, что сказал @gere, не совсем верно, вы можете использовать представление с репозиториями весенних данных, но есть некоторые ограничения, связанные с ограничением самого представления.
В моем случае проблема заключалась в том, что я использовал аннотацию CompositeIndex и индексировал документ, который представляет представление, и поскольку MongoDB view использует базовые индексы коллекции, поэтому у него нет команды operation для создания индекса для себя, и когда spring data пытается создать индекс для этого представления, MongoDBвыдает исключение. После удаления этих аннотаций я смог использовать их через свой репозиторий. Я бы посоветовал вам также использовать репозиторий только для чтения, чтобы предотвратить использование метода сохранения или удаления, поскольку я думаю, что это тоже ограничение просмотра. если вы выполните поиск, вы можете найти примеры репозиториев, доступных только для чтения.
В вашем случае вам нужно найти, какую операцию вы пытались выполнить в обычной коллекции, которую view не поддерживает.
Комментарии:
1. Спасибо @navid_gh!!