在mongodb中编辑子文档N-N关系

2024-05-07

我有一个应用程序,其中article可以链接到多个平台.

文章包含平台列表,平台也包含文章列表。

有关更多详细信息,请查看我几个月前提出的 stackoverflow 问题。

https://stackoverflow.com/a/40377383/5770147 https://stackoverflow.com/a/40377383/5770147

问题是如何创建一篇文章,并实现文章与平台之间的N-N关系。

我有创建文章和删除文章设置,以便列表也在平台中更新。

如何实现编辑文章以便更新链接到文章的平台?

为了创建和编辑链接的平台,我使用一个下拉菜单,可以在其中选择多个选项。必要的代码可以在之前链接的问题中找到。


根据您提供的信息,我会推荐两种可能的方法,从相同的基础开始:

使用两个集合(文章和平台),并仅将平台文档的引用存储在文章定义的数组中 文件

如果出现以下情况,我会推荐这种方法:

  • 您的两个文章文档的基数都很高,并且 平台
  • 您希望能够独立管理两个实体,同时 还同步它们之间的引用

    // articles collection schema
    {
    "_id": ...,
    "title": "I am an article",
    
    ...
    
    "platforms": [ "platform_1", "platform_2", "platform_3" ],
    ...
    }
    
    
    // platforms collection schema    
    {
    "_id": "platform_1",
    "name": "Platform 1",
    "url": "http://right/here",
    ...
    },
    
    {
    "_id": "platform_2",
    "name": "Platform 2",
    "url": "http://right/here",
    ...
    },
    
    {
    "_id": "platform_3",
    "name": "Platform 3",
    "url": "http://right/here",
    ...
    }
    

即使这种方法非常灵活,它也是有代价的 - 如果您同时需要文章和平台数据,您将不得不向 MongoDB 实例发起更多查询,因为数据被分成两个不同的集合。

例如,在加载文章页面时,考虑到您还想显示列表platforms,你必须向articles collection,然后还触发搜索platforms collection通过成员检索该文章发布到的所有平台实体platforms 数组上article document.

但是,如果您只有一小部分经常访问的platform attributes加载时您需要提供article document,你可能会增强platforms数组上的articles collection除了存储这些属性_id平台文档参考:

// enhanced articles collection schema  
{
"_id": ...,
"title": "I am an article",

...

"platforms": [
    {platform_id: "platform_1", name: "Platform 1"},
    {platform_id: "platform_2", name: "Platform 2"},
    {platform_id: "platform_3", name: "Platform 3"}
],

...

}

如果以下情况,这种混合方法将是合适的:platform data attributes您经常检索并与文章特定数据一起显示的数据不会经常更改。

否则,您将必须同步对platform document attributes in the platforms collection包含您作为文章文档平台数组的一部分进行跟踪的属性子集。

关于各个平台的文章列表的管理,我不建议在两个集合中存储 N 到 N 的引用,因为前面提到的机制已经允许您通过查询来提取文章列表。articles collection使用查找查询_id的值platform document:

Approach #1
db.articles.find({"platforms": "platform_1"});

Approach #2:
db.articles.find({"platforms.platform_id": "platform_1"});

在介绍了两种不同的方法之后,我现在建议您分析应用程序的查询模式和性能阈值,并根据您遇到的场景做出经过计算的决策。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在mongodb中编辑子文档N-N关系 的相关文章

随机推荐

  • Android Room 持久性库无法在库项目内工作

    我正在开发一个 Android 库 并希望在其中使用新的 Android Room 持久性库 但是 启动时我收到此错误 Caused by java lang RuntimeException cannot find implementat
  • Flask.cli.NoAppException:导入“app”时,引发了 ImportError:

    1 我正在尝试构建一个flask项目并尝试将类导入到models py中并将路由导入到app py中 当我尝试运行该项目时 它显示了一些错误 这是回溯的信息 Traceback most recent call last File User
  • 在 Outlook 中创建带有附件的邮件并显示它

    我想在 Outlook 中创建一封带有附件的邮件并在发送之前显示它 但我想我已经尝试了几乎在网上找到的所有示例 但没有任何运气 我可以使用 Indy 但我非常想使用 Outlook 来确保邮件正确 因为它是用于商业用途 函数的任何输入 该函
  • 是否可以将 .gs 文件上传到复制的 Google 文档的应用程序脚本项目?

    我复制了一个电子表格供多人使用 并附加了脚本 我的问题是如何修改项目中的脚本 而不必将每个更改复制并粘贴到 gs项目中的文件 This is the base document from which the other versions w
  • 使用 AVX 内在函数代替 SSE 并不能提高速度 - 为什么?

    我已经使用 Intel 的 SSE 内在函数相当长一段时间了 并取得了良好的性能提升 因此 我希望 AVX 内在函数能够进一步加速我的程序 不幸的是 直到现在情况并非如此 可能我犯了一个愚蠢的错误 所以如果有人能帮助我 我将非常感激 我使用
  • 在 RDBMS 中何时使用三元关系而不是聚合?

    我想知道什么时候可以表示实体集和三元关系之间的关系 我明白聚合的好处 但是如果实体集和关系集之间的关系中没有属性 为什么还要使用聚合呢 例如 一名研究生 具有学生编号和姓名 正在从事一个项目 具有 pid 开始日期和结束日期 并且学生从事的
  • 由于无法连接到访问服务器,artifactory 6.8.7 将无法启动

    自从在 RHEL 7 上使用 rpm 升级到 6 8 7 后 使用 systemctl start artifactory 失败 查看日志此时失败 2019 03 16 09 50 28 952 art init INFO o a s a
  • 如何在 Xcode 中使用“-force_load”链接库?

    我的其他库不允许我设置 ObjC 或 all load 标志 所以我需要使用 force load 来链接我的库 我的项目下有 GoogleOpenSource framework 和 GooglePlus framework 那么如何正确
  • 通过 somain 注册器 1and1 smtp 使用 Spring 邮件发送邮件时出现问题

    我正在尝试使用 Spring Mail 1 5 8 RELEASE JavaMailSender 从 Spring Boot 应用程序发送电子邮件 通过 gmail SMTP 发送就可以了 但是 通过我的域名注册商的 amtp 注册商名称
  • 为什么我收到此错误“未绑定 XML 命名空间前缀”

    我几乎完成了一个简单的 Android 应用程序的编写 它似乎运行良好 但是 当我运行代码分析时 我收到大约 100 个有关 xml 文件的警告 我收到的错误是 未绑定 XML 命名空间前缀 和 命名空间未绑定 这是我的一个 xml 文件中
  • RMagick 安装无法构建本机扩展

    在 Mountain Lion 上 我尝试安装 RMagick 我找到了一个GitHub 上的问题 https github com mroth lolcommits issues 56解决方案应该是命令gem pristine rmagi
  • 为什么子进程默认使用列表而不是带空格的字符串?

    为什么Python的subprocess模块默认情况下期望参数为列表吗 为什么带空格的字符串 类似于正常运行命令时在终端中输入的内容 不是默认输入 有很多资料解释了如何将命令的空格分隔字符串传递到subprocess 但不太清楚为什么默认值
  • 即使只有单个项目,也强制 uiscrollview 弹跳滚动

    我有一个 UIScrollView 其中包含不同数量的项目 子视图 当有多个项目时 滚动弹跳起作用 然而 有时滚动视图应该只有一项 我想向用户提供他们的滚动被识别的反馈 从而产生反弹效果 但是 UIScrollView 仅禁用一项滚动 答案
  • 为什么是补码?

    我正在编写一个教程来教孩子们 9 至 13 岁 编程 我从计算机本身开始 它们与计算机科学没有太大关系 更多的是涉及解决计算问题的过程 以此为出发点 我引导他们认识到机器可以帮助我们解决某些计算问题 人们擅长抽象思维和想象力 但计算机非常擅
  • 如何使用 URL 将数据从 javascript 发送到 ASP.NET MVC 控制器

    我需要一些帮助 我使用 ASP NET MVC4 以及 JavaScript 和 Knockout 编写了一个小应用程序 但我无法将数据从 javascript 发送到 MVC 控制器 反之亦然 例如JS部分是这样的 JavaScript
  • 防止 Excel 公式中的单元格数量增加

    我在 Excel 中有一个公式 需要根据该行中的数字除以一个常数对该列的几行运行 当我复制该公式并将其应用于范围中的每个单元格时 所有单元格编号都会随行增加 包括常量 所以 B1 127 C4 IF B4 lt gt B4 B1 如果我复制
  • @EnableJpaRepositories 正在寻找哪个包?

    我正在学习如何构建 JSF 和 Spring 集成的 webapp 我使用java config来配置 问题是 EnableJpaRepositories 我应该在这个注解中放入哪个包 包中包含实体类吗 或者配置类 或者 我可以将我的根包放
  • 推送通知发送成功,但设备收不到(偶尔)

    从昨天开始 我一直遇到一些设备无法收到推送通知的问题 证书 设备令牌似乎是正确的 直到昨天 该设备才能成功接收推送通知 在服务器端 没有错误或连接拒绝 并且推送通知似乎每次都成功发送 但仍然有很多情况下设备无法正确接收推送 一些周边信息 我
  • 在 PHP 中删除 foreach 之后数组中的空字段

    我是 PHP 新手 这是我的 mailing php 中的代码 当用户提交请求时 有 5 7 个可选字段和 20 25 个字段最终未被选择 输出列出所有字段和值 无论它们是空的还是已被选择 我知道我需要使用unset or array fi
  • 在mongodb中编辑子文档N-N关系

    我有一个应用程序 其中article可以链接到多个平台 文章包含平台列表 平台也包含文章列表 有关更多详细信息 请查看我几个月前提出的 stackoverflow 问题 https stackoverflow com a 40377383