【问题标题】:How to persist nested documents in mongodb Spring Boot?如何在 mongodb Spring Boot 中持久化嵌套文档?
【发布时间】:2019-02-19 19:19:52
【问题描述】:

我想在 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);
}

然后我有一个控制器,它获取用户 ID 和符号以及数量,现在如果用户已经购买了股票,我想将其添加为 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);

但它会将用户购买的所有股票返回给我,因此我必须遍历它们中的每一个,我认为这不是最佳做法。任何帮助,将不胜感激。谢谢

【问题讨论】:

    标签: java mongodb spring-boot spring-data-mongodb


    【解决方案1】:

    拥有一个文档会使实现一致性变得更加困难。目标是由 @DBRef 链接的单独文档,类似于 JPA 中的 @ManyToOne。

    【讨论】:

    • 感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    相关资源
    最近更新 更多