在版本3.4中更改。
$graphLookup¶对集合执行递归搜索,其中包含用于通过递归深度和查询过滤器限制搜索的选项。
在$graphLookup搜索过程总结如下:
输入文档进入$graphLookup聚合操作阶段。
$graphLookup将搜索定位到该from参数指定的集合(有关搜索参数的完整列表,请参见下文)。
对于每个输入文档,搜索均以指定的值开始startWith。
$graphLookup将startWith值与集合connectToField中其他文档中指定的字段匹配from。
对于每个匹配的文档,$graphLookup采用的值,connectFromField并检查from集合中的每个文档
的匹配connectToField值。对于每个匹配项,$graphLookup将from集合中的匹配文档添加
到由as
参数命名的数组字段中。
此步骤以递归方式继续进行,直到找不到更多匹配的文档,或者直到操作达到该maxDepth参数指定的递归深度为止。$graphLookup然后将数组字段附加到输入文档。$graphLookup
搜索完所有输入文档后,返回结果。
$graphLookup 具有以下原型形式:
$graphLookup 接收具有以下字段的文档:
| 领域 | 描述 |
|---|---|
from |
$graphLookup
搜索操作的目标集合,将递归匹配
connectFromField到connectToField。该from集合无法分片,并且必须与操作中使用的任何其他集合位于同一数据库中。有关信息,请参见分片集合。 |
startWith |
该表达式指定connectFromField开始递归搜索时使用的值。可选地,startWith可以是值的数组,每个值都分别经过遍历过程。 |
connectFromField |
其值$graphLookup用于connectToField与集合中其他文档的递归匹配的字段名称。如果值是数组,则每个元素都将分别经过遍历过程。 |
connectToField |
其他文档中与该connectFromField
参数指定的字段值相匹配的字段名。 |
as |
添加到每个输出文档中的数组字段的名称。包含在 注意
|
maxDepth |
可选的。指定最大递归深度的非负整数。 |
depthField |
可选的。要添加到搜索路径中每个已遍历文档的字段名称。该字段的值是文档的递归深度,用表示
NumberLong。递归深度值从零开始,因此第一次查找对应于零深度。 |
restrictSearchWithMatch |
可选的。为递归搜索指定其他条件的文档。该语法与查询过滤器语法相同 。 注意 您不能在此过滤器中使用任何聚合表达式。例如,查询文档如 在这种情况下将无法找到 |
from无法分
片中指定的集合。但是,可以对运行该aggregate()方法的集合
进行分片。也就是说,在下面:
collection可以分片。fromCollection不能分片。要加入多个分片集合,请考虑:
$graphLookup聚合阶段。将maxDepth字段设置0为等效于非递归$graphLookup搜索阶段。
该$graphLookup阶段必须保持在100 MIB内存限制之内。如果为操作指定了
,则
阶段将忽略该选项。如果有观察其他阶段的
操作,
选择在这些其他阶段的效果。allowDiskUse: trueaggregate()$graphLookupallowDiskUse: trueaggregate()allowDiskUse: true
有关更多信息,请参见聚集管道限制。
如果执行涉及多个视图的聚合(例如with $lookup或)$graphLookup,则这些视图必须具有相同的排序规则。
名为的集合employees具有以下文档:
以下$graphLookup操作在
集合中的reportsTo和name字段上进行递归匹配employees,返回每个人的报告层次结构:
该操作返回以下内容:
下表提供了文档的遍历路径:{ "_id" : 5, "name" : "Asya", "reportsTo" : "Ron" }
| 起始值 | 该 |
|---|---|
| 深度0 | |
| 深度1 | |
| 深度2 |
输出生成层次结构
。Asya -> Ron -> Eliot -> Dev
像一样$lookup,$graphLookup可以访问同一数据库中的另一个集合。
在以下示例中,数据库包含两个集合:
airports具有以下文件的集合:
travelers具有以下文件的集合:
对于travelers集合中的每个文档,以下聚合操作将查找集合中的nearestAirport值,
airports然后将该connects
字段与该字段进行递归匹配airport。该操作将最大递归深度指定为2。
该操作返回以下结果:
下表提供了递归搜索的遍历路径,最深处为2,其中起点airport是JFK:
| 起始值 | 集合中的 |
|---|---|
| 深度0 | |
| 深度1 | |
| 深度2 |
下面的示例使用一个集合,该集合包含一组文档,其中包含人的名字以及他们的朋友和爱好的数组。聚合操作会找到一个特定的人,并遍历她的联系网络,以找到golf在其兴趣中列出的人。
名为的集合people包含以下文档:
以下聚合操作分为三个阶段:
$match与具有name包含字符串的字段的文档匹配。返回一个输出文档。"Tanya Jordan"$graphLookup将输出文档的friends
字段与name集合中其他文档的字段连接起来,以遍历连接网络。此阶段使用参数查找仅包含数组的文档。返回一个输出文档。Tanya Jordan'srestrictSearchWithMatchhobbiesgolf$project调整输出文档的形状。列出的名称
connections who play