Как сохранить вложенные документы в mongodb Spring Boot? - PullRequest
0 голосов
/ 15 сентября 2018

Я хочу сохранить документ в 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();
    }

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

BoughtStocks.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);

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

1 Ответ

0 голосов
/ 22 сентября 2018

Имея один документ, вы усложняете достижение согласованности. Ориентируйтесь на отдельные документы, связанные @DBRef, аналогично @ManyToOne в JPA.

...