在版本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: true
aggregate()
$graphLookup
allowDiskUse: true
aggregate()
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's
restrictSearchWithMatch
hobbies
golf
$project
调整输出文档的形状。列出的名称
connections who play