Mongodb递归查询

2024-02-16

我的中有以下架构taxon收藏 :

{ 
  "_id": 1, 
  "na": [ "root_1",
        "root_2",
        "root_3" ], 
  "pa": 1 
},{
  "_id": 2, 
  "na": [ "name_1", 
        "name_2", 
        "name_3"], 
  "pa": 1
},{
  "_id": 4, 
  "na": [ "otherName_1", 
        "otherName_2", 
        "otherName_3"],
  "pa": 2
}

每个文档通过父字段与另一个文档相关,父字段对应于_id它的父级。

我想执行递归搜索以获得以下结果:

{ "_id": 4, 
  "nameList": [ "otherName_1",
              "name_1",
              "root_1"]
} 

从具有一定的文档_id, 获取第一项na每个父级的数组,直到文档_id: 1到达了

我目前通过执行 X 查询(由父文档执行一个查询,这里是 3 个)来获得此结果,但我非常确定这可以使用单个查询来实现。我已经看过新的了$graphLookup https://docs.mongodb.com/manual/reference/operator/aggregation/graphLookup/操作员,但无法按照我的方式进行操作......

是否可以使用 MongoDB 3.4.1 在单个查询中实现此目的?

Edit

我每次都会运行 50 个文档,因此最佳解决方案是将所有内容合并到一个查询中

例如,它看起来像

var listId = [ 4, 128, 553, 2728, ...];
var cursor = db.taxon.aggregate([
  {$match: 
     { _id: {$in: listId}}
  }, ...
)];  

并会输出:

[{ "_id": 4, 
  "nameList": [ "otherName_1",
              "name_1",
              "root_1"]
}, { "_id": 128, 
  "nameList": [ "some_other_ame_1",
              "some_name_1",
              "root_1"]
}, { "_id": 553, 
  "nameList": [ "last_other_ame_1",
              "last_name_1",
              "root_1"]
} ... ]

网上试试:mongoplayground.net/p/GFP-L03Ub0Y https://mongoplayground.net/p/Gfp-L03Ub0Y


您可以尝试下面的聚合。

Stages $match - $graphLookup - $project.

$reduce从每个元素中选取第一个元素$graphLookup nameList's na array.

db.taxon.aggregate([{
    $match: {
        _id: {
            $in: listId
        }
    }
}, {
    $graphLookup: {
        from: "taxon",
        startWith: "$_id",
        connectFromField: "pa",
        connectToField: "_id",
        as: "nameList"
    }
}, {
    $project: {
        nameList: {
            $reduce: {
                input: "$nameList",
                initialValue: [],
                in: {
                    "$concatArrays": ["$$value", {
                        $slice: ["$$this.na", 1]
                    }]
                }
            }
        }
    }
}])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mongodb递归查询 的相关文章

随机推荐

  • 如何获取HTA窗口的大小?

    您可以设置 HTA 窗口的大小 但我找不到获取其大小的方法 我所能想到的就是读书document body offsetWidth and offsetHeight 但这些给你的是视口大小而不是实际的窗口大小 有可能知道吗 似乎没有属性或方
  • 退出临界区

    考虑多个线程同时执行以下代码 long gf 0 global variable or class member if InterlockedCompareExchange gf 1 0 0 lock cmpxchg some exclus
  • 重写 JS 中的赋值运算符

    var myObject myKey myValue typeof myObject myKey returns string myObject myKey newValue console log myObject myKey print
  • 如何在Python 3.x中强制输入整数? [复制]

    这个问题在这里已经有答案了 我正在尝试用 Python 编写一个程序 该程序接受输入以重复斐波那契数列的次数 i 1 timeNum input How many times do you want to repeat the sequen
  • 用 C++ 读/写设备

    如何用 C 读取 写入设备 该设备位于 dev ttyPA1 我考虑过 fstream 但我不知道设备是否具有我可以在不阻塞应用程序的情况下读取的输出 我的目标是创建一个应用程序 您可以在终端中写入一些内容 然后将其发送到 dev ttyP
  • 简单 SparkSQL 查询中未修剪分区

    我正在尝试从 SparkSQL 表 S3 中的 parquet 有效地选择各个分区 但是 我看到 Spark 打开表中所有 parquet 文件的证据 而不仅仅是那些通过过滤器的文件 对于具有大量分区的表来说 即使是小型查询也会变得昂贵 这
  • IOS Swift - 无法从地址簿中检索个人笔记

    有人有什么建议为什么我可以获得名字 姓氏和生日 但是我无法检索从 iphone 通讯录中提交的笔记吗 准备工作 已授予地址簿访问权限 添加到地址簿中的人员包含所有字段 包括注释 当前结果 nil 仅用于注释 所有其他字段均已正确检索 使用的
  • Firebase 中如何计算连接

    连接数是如何计算的 假设我有一个 Web 应用程序 其中一个负载会向所有连接的客户端发送一条消息 假设我有 5 个连接的客户端 这是否意味着只要打开了 Web 应用程序的浏览器选项卡 它就会计为 1 个连接 这意味着我将有 6 个并发连接
  • 无法从groovy连接到oracle数据库

    您好 我无法连接到 groovy 中的 Oracle 数据库 我在 groovy 控制台中使用了以下代码 但出现以下编译错误 unable to resolve class oracle jdbc driver OracleTypes at
  • 找不到 ViewModel 的视图

    我有一个使用 Caliburn Micro 的 wpf 应用程序 我有一个视图 MyView
  • Python:没有名为“dash.development”的模块。 “dash”不是一个包

    我正在尝试运行这个 Dash 教程https github com cryptopotluck alpha vantage tutorial tree master dash bootstrap https github com crypt
  • R:如何相对于 x 轴分散(抖动)点?

    我在 R 中有以下代码片段 dat lt data frame cond factor rep A 10 rating c 1 2 3 4 6 6 7 8 9 10 ggplot dat aes x cond y rating geom b
  • 无法在 Visual Studio 2013 中显示 SQL Azure 表定义

    我收到的错误是 加载问题 设计器在加载表定义时遇到错误 我可以很好地查看VS内表中的数据 甚至还可以查询数据 这是我的计算机上的全新安装 我尝试过的 尝试在 服务器资源管理器 和 SQL Server 对象资源管理器 检查我的登录凭据是否有
  • 我应该使用什么标记来描述使用 schema.org 的社交媒体链接?

    我有一个地方 本地企业 其中有多个字段可以很好地映射到 schema org 条目 有一个字段我不确定如何标记 我们有该企业社交媒体帐户的链接 例如 Twitter 帐户 Facebook 页面和 Pinterest 帐户 这些应该如何在
  • Django:ModelChoiceField 删除默认--------- 选择

    如何从 ModelChoiceField 中删除默认的 选择 Use empty label None field2 forms ModelChoiceField queryset empty label None 请检查文档模型选择字段
  • 如何使用 SFINAE 检测 noexcept 方法

    我问的是一个 流行 问题的变体 检测类方法的存在 我在 SO 中读过很多答案 大多数 C 17 后 解决方案看起来像this https stackoverflow com questions 55191505 c compile time
  • 分发依赖于静态框架的动态框架的正确方法是什么?

    我正在构建一个闭源动态框架 它依赖于第三方闭源静态框架 我将静态依赖框架链接到我的框架的项目 目标 如中所述这个苹果技术说明 https developer apple com library content technotes tn243
  • 如何使用 RestClient 修复 Ruby 中的套接字错误?

    我在用RestClient在 ruby 类中进行网络调用 我得到了SocketError每当我没有连接到互联网时 我已经添加了一个救援块来捕获异常 但我仍然无法这样做 错误消息是 SocketError Failed to open TCP
  • 如何在不使用内置指令的情况下在 MIPS 汇编中实现乘法和除法?

    好吧 问题就在这里 我必须编写一个 MIPS 程序 从用户那里获取 2 个输入数字 然后 我必须编写一个代码来输出用户输入的 2 个数字的乘积 商和余数 现在 这非常简单 但是 我没有意识到我们不能在程序中使用乘法和除法操作数 现在我不知道
  • Mongodb递归查询

    我的中有以下架构taxon收藏 id 1 na root 1 root 2 root 3 pa 1 id 2 na name 1 name 2 name 3 pa 1 id 4 na otherName 1 otherName 2 othe