如何在mongodb中级联删除文档?

时间:2018-09-03 10:54:57

标签: mongodb spring-boot nosql

我在Mongodb中有用户和照片文档。每张照片属于用户,并且照片可能在用户之间共享。假设user1有p1,p2,p3张照片,而user2有p3,p4,p5张照片。如果删除user1(通常使用Compass之类的工具),则p1和p2也应该删除,但不能删除p3。如何实现这一目标以及我需要定义哪种数据库结构?

当前,如果我删除user1,则不会删除任何照片并将其保留在数据库中,这从使用数据库的应用程序的角度来看,这会使数据库损坏。

其Spring Boot应用以及用户和照片声明为:

import lombok.Builder;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.DBRef;
import org.springframework.data.mongodb.core.mapping.Document;
@Document
@Data
@Builder
public class User {

    @Id
    private String id;


    @DBRef
    private Set<Photo> photos;


    private String name;
}

@Document
@Data
@Builder
public class Photo {

    @Id
    private String id;


    private String fileName;

}

2 个答案:

答案 0 :(得分:3)

正如m4gic所提到的以及在他所链接的问题(herehere)中,MongoDB不支持级联删除。在您的情况下,您可能应该在User对象中创建一个数组,然后将完整的子文档放入该数组中,而不是将它们保留在自己的集合中。这样,它们将与父级一起删除,因为它们是父级的一部分。

答案 1 :(得分:2)

MongoDB目前不支持级联删除。由于您已经将参考照片存储在用户模型中,因此您可以从参考列表中获取照片ID,并将其一起删除。或者,也可以将照片数组嵌入到用户对象中,而不是将照片存储在单独的集合中。

您也可以参考此链接: What is the recommended equivalent of cascaded delete in MongoDB for N:M relationships?