Как сохранить вложенные документы в mongodb Spring Boot?

Я хочу сохранить документ в MongoDb в таком формате json

{
    "userId": "5b89411a161aef03a2ac6847",
    "stocks": [
        {
            "symbol": "aapl",
            "company": "Apple Inc",
            "group": [
                {
                    "quantity": 110,
                    "date": "2018-09-02 14:33:51",
                    "price": "215.00",
                    "type": "SEC"
                }
            ]
        }
    ]
}

У меня есть такая настройка mongoRepository

public interface UserBuyingRepository extends MongoRepository<BoughtStocks, String>{
    BoughtStocks findByUserId(String userId);
}

Затем у меня есть контроллер, который получает идентификатор пользователя, символ и количество, и теперь, если пользователь уже купил акцию, я хотел бы добавить ее в качестве следующего элемента в group, и если он не купил акцию, я бы хотел добавить ее. как следующий элемент в stocks. Мой контроллер выглядит так, и я застрял здесь.

@GetMapping("/buy/{symbol}/{quantity}")
    public String userBuyingStock(@PathVariable("userID") String userId,
                                  @PathVariable(value = "symbol") String symbol, @PathVariable(value = "quantity") int quantity) {   

        BoughtStocks boughtStocks = userBuyingRepo.findByUserId(userId);

        String date = "2018-9-23"
        if (boughtStocks == null){
            Group group = new Group();
            group.setDate(date);
            group.setPrice(213);
            group.setQuantity(quantity);
            group.setType("SEC");

            List<Group> groupList = new ArrayList<>();
            groupList.add(group);

            Stock stock = new Stock();
            stock.setSymbol(symbol);
            stock.setCompany("Apple Inc");
            stock.setGroup(groupList);

            List<Stock> stockList = new ArrayList<>();
            stockList.add(stock);

            boughtStocks = new BoughtStocks();
            boughtStocks.setUserId(applicationUser.getId());
            boughtStocks.setStocks(stockList);
        }else{
            Group group = new Group();
            group.setDate(date);
            group.setPrice(213);
            group.setQuantity(quantity);
            group.setType("SEC");

            List<Group> groupList = new ArrayList<>();
            groupList.add(group);
            Stock stock = new Stock();
            stock.setSymbol(symbol);
            stock.setCompany("Apple Inc");
            stock.setGroup(groupList);
            boughtStocks.getStocks().add(stock);
        }
        userBuyingRepo.save(boughtStocks);
        return company.getCompanyName();
    }

Мои модели такие

КупилStocks.java

public class BoughtStocks {
    @Id
    private String userId;
    private List<Stock> stocks = null;


    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public List<Stock> getStocks() {
        return stocks;
    }

    public void setStocks(List<Stock> stocks) {
        this.stocks = stocks;
    }

}

Stock.java

public class Stock {
    @Id
    private String symbol;
    private String company;
    private List<Group> group = null;


    public String getSymbol() {
        return symbol;
    }

    public void setSymbol(String symbol) {
        this.symbol = symbol;
    }

    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }

    public List<Group> getGroup() {
        return group;
    }

    public void setGroup(List<Group> group) {
        this.group = group;
    }

}

Groups.java

public class Group {

    private Integer quantity;
    private String date;
    private String price;
    private String type;


    public Integer getQuantity() {
        return quantity;
    }

    public void setQuantity(Integer quantity) {
        this.quantity = quantity;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

}

Здесь я упускаю из виду основную концепцию. Я пробовал использовать это

@Query(value = "{'userId':'?0','stocks.symbol':'?1'}",fields = "{'stocks.symbol':'?1'}")
    List<Stock> findByStockSymbol(String userId,String symbol);

Но он возвращает мне все акции, купленные пользователем, поэтому мне приходится перебирать каждую из них, и я не думаю, что это лучшая практика. Любая помощь будет оценена по достоинству. Спасибо

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
757
1

Ответы 1

Имея один документ, вы затрудняете достижение согласованности. Стремитесь к отдельным документам, связанным с помощью @DBRef, подобно @ManyToOne в JPA.

Спасибо, что помогло!

Xrio 17.08.2020 17:16

Другие вопросы по теме