MongoDB 内容管理查询(SQL 中的分组和区分)

MongoDB Content Management Query (Grouping and Distinct in SQL)

我正在尝试管理上传到服务器的媒体并删除不再使用的文件。

一个媒体文件可以link由多个条目编辑,一个条目可以link正好是一个媒体文件"content",但我可以删除内容并添加新内容。

一个媒体文件由缩略图、预览图像、移动、标清和高清视频、低质量和高质量音频或可下载文件(PDF、PPT、Word 等)组成

当媒体 "deleted" 来自最后一个条目时,应将其删除。

我的想法来自MySQL,在那里我会做这样的事情:

有一个 Table 媒体,其中包含媒体文件的所有 link 和我的 "entries" table 和媒体 table 之间的交叉 table =37=].

在交叉 table 中,当条目被删除或上传新媒体时(因此 linking 被删除)我会删除相应的行

任何时候,我用于删除媒体的 cronjob 运行时,我都会检查媒体的哪个条目 table 不在交叉 table 中并删除这些条目。

我如何在 MongoDB 中做到这一点?

你的问题有点令人恼火,因为你说 "one entry can link exactly one media file" 和“[...] 以及我的条目 table 和媒体 table 之间的交叉 table ”。如果您指的是链接器 table,为什么在 MySQL 中需要它?

无论如何,无论您想要 M:N 还是 1:N 关系,您都可以采用基本相同的方式进行操作:

entry { 
   _id : ObjectId("..."),
   // 1:N
   mediaId : ObjectId("..."),
   // M:N
   mediaIds : [ ObjectId("..."), ... ]
   ...
}

media { 
   _id : ObjectId("..."),
   ...
}

您的工作人员必须 运行 检查所有媒体文档并检查是否存在相应的条目。由于这在计算上可能很昂贵,因此在每个媒体文档中保留一个 refCount 可能是值得的,当插入引用该媒体的新条目时递增,并在删除时递减。由于在极少数情况下该计数器可能不正确(竞争条件、client/db 崩溃或两个操作之间的网络分区),您可能需要确保在实际删除之前确实没有留下任何引用。