Весенние данные с представлениями MongoDB

#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!!