【问题标题】:How to cascade delete document in mongodb?如何在mongodb中级联删除文档?
【发布时间】:2019-02-08 10:12:43
【问题描述】:

我在 Mongodb 中有用户和照片文档。每张照片都属于用户,并且可以在用户之间共享一张照片。假设 user1 有 p1、p2、p3 照片,而 user2 有 p3、p4、p5 照片。如果我删除 user1(手动使用 Compass 等工具),p1 和 p2 也应该被删除,而不是 p3。如何实现,需要定义什么样的数据库结构?

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

它的 Spring Boot 应用和 User 和 Photo 声明为:

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;

}

【问题讨论】:

  • 你必须这样做manually 不支持它。类似的答案是here

标签: mongodb spring-boot nosql


【解决方案1】:

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

【讨论】:

  • 请记住,最大 BSON 文档大小为 16 兆字节
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    @mindcraft 是对的,但是如果您想将照片保存在单独的集合中,那么您可以将访问属性添加到 photo 文档中,例如

    {
      ref: 'https://....',
      access:[user1._id, user2._id]
    }
    
    

    然后你可以像这样查询 -

    db.photos.find({access:{$in:[user1._id]}})
    

    虽然专门为照片单独收集不会有太大帮助。而是尝试将照片网址放入数组中

    【讨论】:

      猜你喜欢
      • 2022-09-26
      • 2022-11-24
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      相关资源
      最近更新 更多