如何使用 MongoDB 递归查询树结构?

2023-11-23

例如树结构为;

[
    {id: 1 , childrenIdList: [2, 3]},
    {id: 2 , childrenIdList: [4, 5]},
    {id: 3 , childrenIdList: []},
    {id: 4 , childrenIdList: [6, 7]},
    {id: 5 , childrenIdList: []},
    {id: 6 , childrenIdList: []},
    {id: 7 , childrenIdList: []}
]

就像;

               1
          2        3
       4    5
    6    7

如何跟踪从叶节点(id=7)到根(id=1)的树?

寻找父母id=7很简单;

db.document.find({childrenList: { $in: [7]}}, {id: 1}).toArray(function(err), result{
  /*result gives 
  {"id" : NumberInt(4)}
  now I should look the parent of id=4, and parent of id=2 as you know.
  */
})

mongodb 可以进行递归查询吗?我该如何实施?


根据您的用例,MongoDB v3.4提供了一个聚合管道接线员叫$graphLookup。聚合运算符能够对集合执行递归搜索。查看更多定义$graphLookup 定义.

使用上面的文档层次结构和值作为示例,您可以尝试运行以下聚合:

db.collectionName.aggregate([

                {$unwind:{
                        path:"$childrenIdList", 
                        preserveNullAndEmptyArrays: true}
                  }, 
                {$graphLookup:{
                        from:"collectionName", 
                        startWith:"$_id", 
                        connectFromField:"_id", 
                        connectToField:"childrenIdList", 
                        as:"myparents",  
                        restrictSearchWithMatch: {"_id"}}
                  }, 
                {$match: {"_id": 7 } },
                {$group:{
                        _id:"$_id", 
                        parents:{$addToSet:"$myparents._id"}
                  }}
]);

上面应该返回如下结果:

{ "_id" : 7, "parents" : [ [ 1, 2, 4 ] ] }

话虽如此,如果您有一个很大的集合,上述查询可能不会像您将执行的那样执行$unwind在每个文档上,将无法使用索引。正如其他人所建议的,您应该重新考虑您的文档模型结构。看数据模型树结构。根据您的应用程序逻辑和查询用例进行优化,并让灵活的文档架构遵循。

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

如何使用 MongoDB 递归查询树结构? 的相关文章

随机推荐

  • FLD指令x64位

    我在 x64 位中使用 FLD 指令时遇到一些问题 想将Double值加载到st0寄存器中的堆栈指针FPU 但这似乎是不可能的 在 Delphi x32 中 我可以使用以下代码 function DoSomething X Double D
  • 使用 WebApi 的 OData 分页 ( $inlinecount )

    我正在使用 OData 对从 Web api 调用返回的一长串项目进行分页 我可以通过带有开始和结束索引的 url 过滤数据 我的问题是 我如何知道项目的总数 因此 我可以在调用 Web API 的移动设备上显示第 1 页 共 3 页 20
  • 相机启动预览失败

    我正在创建一个相机应用程序 但我遇到了问题startPreview 它向我发送 java lang RuntimeException startPreview failed 这是我的相机Activity public class Camer
  • Azure Web应用程序无法访问Azure DB

    我有一个带有 SQL 数据库和 asp net 5 Web 应用程序的 Azure 试用帐户 数据库服务器防火墙对我的本地计算机 IP 有一条规则 并且还启用了 允许访问 Azure 服务 复选框 我可以毫无意外地从本地 Sql Serve
  • 透明背景视图中的高程

    我有一个具有自定义背景的项目列表 背景是一个简单的形状 带有填充白色的圆角矩形绘图 所以我的观点类似于卡片 我可以在它上面设置一个高度并且它可以工作 它的下面有一个影子 但我想优化它 我的窗口背景是白色的 所以我想我可以删除View的背景颜
  • Python,将数据框中的每日数据汇总为每月和每季度

    我已经将数据加载到 Pandas 数据框中 Example Date Price 2012 12 02 141 25 2012 12 05 132 64 2012 12 06 132 11 2012 12 21 141 64 2012 12
  • 如何在 SQLAlchemy 中实现关注/关注者关系

    以推特为例 我们有一个User类 我们想将用户定义为Follower and Followed 我们希望有一个这样的方法u followers 它返回关注该用户的用户列表u 相似地 u following应该返回用户列表 该用户u正在跟随
  • 有没有办法知道用户点击了验证链接?

    这是我用来发送验证电子邮件的代码 取自官方docs var user firebase auth currentUser user sendEmailVerification then function Email sent catch f
  • 如何获取窗口标题按钮的大小和位置(最小化、恢复、关闭)

    是否有 API 调用来确定窗口标题按钮的大小和位置 我正在尝试将 vista 风格的标题按钮绘制到所有者绘制的窗口上 我正在处理c c mfc 编辑 有人有绘制关闭按钮的代码示例吗 我找到了获取 vista 中按钮位置所需的函数 WM GE
  • 我如何从 QWidget 和 QThread 继承?

    我有一堂这样的课 class GUI public QWidget public QThread 当我执行上述操作时 我收到有关连接信号的错误 The error says Reference to connect is ambiguous
  • MSN 天气 API 条件列表?

    微软有一个与谷歌非常相似的天气API 谷歌现在似乎已经完全消失了 我已将我的一个应用程序转换为他们的源 但我无法找到所有可能的天气条件的列表 Google 天气 API 对此有很好的记录 但我找不到 MSN 天气 API 的条件列表 FWI
  • jQuery 验证器 - 动态添加验证时无法调用未定义错误的方法“call”

    这是我动态更新 jQuery 验证的代码 在文档加载中我创建验证 此代码用于动态更新电话号码验证 应用此验证后 当我在电话号码文本框中输入任何内容时 我收到无法调用未定义错误的方法 call phone rules remove phone
  • 获取运行 Java 应用程序时使用的所有类的列表?

    获取运行 Java 应用程序时使用的所有类的列表的最简单方法是什么 假使 假设com package Foo main通过运行调用 java com package Foo 运行程序后 我希望获得运行程序时使用的所有类的列表 cat cla
  • 使用 boto 列出自动伸缩组中的实例

    我想列出当前在自动扩展组中运行的所有实例 用boto可以实现吗 ASG 和实例之间一定存在某种关系 因为 boto 具有shutdown instances内的方法boto ec2 autoscale group AutoScalingGr
  • MAMP-Windows 上的 MySQL 服务器无法启动

    我在 Windows 10 上使用 MAMP 4 1 无法启动 MySQL 服务器 当我卸载 MAMP 并重新安装它时 MySQL 服务器会启动 但是当我停止它时 它不会启动备份 我还进入 mamp db mysql 并删除了下面 hili
  • 在 Java Web 应用程序中存储和访问资源文件的最佳实践

    我有一堆文本 xml 和其他文件 即资源 我需要在 java web 应用程序中使用 servlet 访问它们 例如 有一个xml文件 其中一部分是由用户查询用servlet返回的 我正在使用汤姆猫 存储这些文件并从 java 代码访问它们
  • UI 路由器:多个独立视图

    我觉得这是一个直接的用例ui router但也许我错过了一些东西 我希望有两个相邻的独立视图由各自的菜单控制 当我点击一个ui sref一个菜单上的链接 或 state go就此而言 我只想更新其中一个观点 此外 两种观点中只需要反映其中一
  • 在应用程序计费 v3 中使用 IabHelper 出现 IllegalArgumentException

    我已经在我的应用程序中实施应用程序计费 v3 大约一周了 我使用了很多android的示例代码来简化集成 我经常记录一次崩溃 但似乎无法重现 Exception Type java lang RuntimeException Reason
  • 如何在 JavaScript Azure Functions 中共享代码?

    如何在 Azure 函数应用中的文件之间共享代码 例如 Mongo 架构定义 我需要这样做 因为我的函数需要访问共享的 mongo 架构和模型 例如这个基本示例 var blogPostSchema new mongoose Schema
  • 如何使用 MongoDB 递归查询树结构?

    例如树结构为 id 1 childrenIdList 2 3 id 2 childrenIdList 4 5 id 3 childrenIdList id 4 childrenIdList 6 7 id 5 childrenIdList i