【问题标题】:Spring data MongoDB adding arrays to an existing documentSpring data MongoDB将数组添加到现有文档
【发布时间】:2017-09-16 12:44:42
【问题描述】:

假设我有以下收藏

    public @Data  class Customer {

    @Id
    private String id;

    private String firstName;
    private String lastName;

    @DBRef
    private List<Address> addressList= new ArrayList<Address>();
}

public @Data class  Address {

    @Id
    private String id;
    private String address;
    private String type;
    private String customerID;
}

而且每个客户都有多个地址,我实现了MongoRepository。第一次保存客户工作得很好customerRepo.save(customerObject),在调用保存之前,我坚持多个地址对象,然后将它们设置为addressList。 下次当我更新同一个文档并想要将一组新地址添加到现有列表时,它会覆盖整个 addressList 数组。所以基本上我现在必须做的是设置像 thisexistingCustomerObject.getAddressList().addAll(my new List of address) 这样的新地址,如果有数千个(或超过一千个)元素,或者我正在对 addressList 数组进行切片,那么下面的过程将不是一个好主意。我的问题是实现这种情况的最佳方法是什么?说如果我不想使用MongoTemplate。是否可以只使用MongoRepository

【问题讨论】:

  • 我认为仅使用 MongoRepositoy 是不可能的。您必须使用 mongotemplate 并执行 $pull
  • 因为我已经将@DBRef 添加到子条目中,即使使用 MongoRepositoy 也不能解决我的问题,因为我想防止同时加载所有子条目。

标签: spring mongodb mongodb-query spring-data spring-data-mongodb


【解决方案1】:

我认为你不能那样做。以前我也有同样的情况,我尝试了以下

1.org.springframework.core.convert.converter.Converter 即使我已经设法操纵了 DBObject,但是像 $push$set(将它们包裹在键下)这样的功能在那里不起作用。

2.AbstractMongoEventListener 通过覆盖 onBeforeSave 但在保存期间未进行对象操作。

但是你可以尝试改变提到的

您可以尝试覆盖MongoRepository保存方法,如果有人指出正确的方向会更好。 否则,对于我的场景,我必须创建与MongoRepository 并行工作的自定义存储库(用于更新和删除文档)(用于插入和检索数据/文档),但我认为这是一个丑陋的解决方法。必须有一种更清洁的方式来做到这一点。

【讨论】:

    猜你喜欢
    • 2015-12-21
    • 2019-11-12
    • 2021-09-20
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    相关资源
    最近更新 更多