- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试使用新的 MongoDB v3.4 $graphLookup 聚合管道。我有这个简单的树集合,有一些节点和一个父 DBRef:
{ "_id" : ObjectId("59380657bbdbfb36c18a80f2"), "name" : "Root node 1" },
{ "_id" : ObjectId("5938068abbdbfb36c18a80f5"), "name" : "Child 1.1", "parent" : ObjectId("59380657bbdbfb36c18a80f2") },
{ "_id" : ObjectId("593806b0bbdbfb36c18a80f7"), "name" : "Subchild 1.1.1", "parent" : ObjectId("5938068abbdbfb36c18a80f5") },
{ "_id" : ObjectId("5938068abbdbfb36c18a80f6"), "name" : "Child 1.2", "parent" : ObjectId("59380657bbdbfb36c18a80f2") },
{ "_id" : ObjectId("59380657bbdbfb36c18a80f3"), "name" : "Root node 2" }
我想得到这种树结构:
- Root node 1
- Child 1.1
- Subchild 1.1.1
- Child 1.2
- Root node 2
因此,我正在尝试使用新的 $graphLookup 聚合管道,如下所示:
db.getCollection('tree').aggregate([
{ $match: { parent: { $exists: false } } },
{
$graphLookup: {
from: "tree",
startWith: "$_id",
connectFromField: "_id",
connectToField: "parent",
as: "children"
}
},
{ $sort: { name: 1 } }
])
但我的问题是我在一个集合中得到了“根节点 1”的所有子节点:
{
"_id" : ObjectId("59380657bbdbfb36c18a80f2"),
"name" : "Root node 1",
"children" : [
{ "_id" : ObjectId("593806b0bbdbfb36c18a80f7"), "name" : "Subchild 1.1.1", "parent" : ObjectId("5938068abbdbfb36c18a80f5") },
{ "_id" : ObjectId("5938068abbdbfb36c18a80f6"), "name" : "Child 1.2", "parent" : ObjectId("59380657bbdbfb36c18a80f2") },
{ "_id" : ObjectId("5938068abbdbfb36c18a80f5"), "name" : "Child 1.1", "parent" : ObjectId("59380657bbdbfb36c18a80f2") }
]
},
{
"_id" : ObjectId("59380657bbdbfb36c18a80f3"),
"name" : "Root node 2",
"children" : [ ]
}
我不知道如何递归查找子项以在“Child 1.1”的子项集合中获取“Subchild 1.1.1”。我正在寻找任何建议。谢谢:)
最佳答案
$graphLookup不产生依赖关系的层次结构——它对连接的文档执行递归搜索,但结果被展平到一维数组中。这是文档中的引述:
For each matching document, $graphLookup takes the value of the _id and checks every document in the tree collection for a matching parent value. For each match, $graphLookup adds the matching document in the from collection to an array children. This step continues recursively until no more matching documents are found, or until the operation reaches a recursion depth specified by the maxDepth parameter.
即它以递归方式搜索相关文档,但无论子文档位于多“深”,每个找到的文档都会添加到父文档的相同子数组中。
注意 - 您看不到 Child 1.1
及其连接的 Subchild 1.1.1
,因为您在 match
阶段过滤掉了这些文档:
{ $match: { parent: { $exists: false } } }
仅选择没有父节点的文档 - “Root node 1”
和 “Root node 2”
。如果您将删除此过滤器,则将返回所有其他具有其从属层次结构的文档:
{
"name" : "Child 1.1",
"children" : [
{ "name" : "Subchild 1.1.1" }
]
},
{
"name" : "Child 1.2"
"children" : []
},
{
"name" : "Root node 1",
"children" : [
{ "name" : "Subchild 1.1.1" },
{ "name" : "Child 1.2" },
{ "name" : "Child 1.1" }
]
},
{
"name" : "Root node 2",
"children" : []
},
{
"name" : "Subchild 1.1.1"
"children" : []
}
如果您不想在单个 child 数组中混合来自不同“深度”树的 child ,那么请查看文档中有趣的评论
Setting the maxDepth field to 0 is equivalent to a non-recursive $lookup search stage.
这意味着每个文档都会将其所有直接子项放入 children 数组中,之后查找将停止而无需任何进一步的递归搜索。输出将是
{
"name" : "Child 1.1",
"children" : [
{ "name" : "Subchild 1.1.1" }
]
},
{
"name" : "Child 1.2"
"children" : []
},
{
"name" : "Root node 1",
"children" : [
{ "name" : "Child 1.2" },
{ "name" : "Child 1.1" }
]
},
{
"name" : "Root node 2",
"children" : []
},
{
"name" : "Subchild 1.1.1"
"children" : []
}
关于MongoDB 的 $graphLookup 试图获取树结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44415646/
我是 C++ 的新手,我在使用这段代码时遇到了问题: string output_date(int day, int month, int year){ string date; if
所以我这样做了 tar cvzf test.zip FP 为了创建目录 FP 的 zip 但是,它会列出 zip 中的目录 FP/ FP/php/ FP/php/pdf/ FP/php/docs/ F
我正在尝试在 Swift、Xcode 7.3(所以是 Swift 2.2)中创建一个通用类,但我似乎无法让它通过编译器: protocol Struct1Protocol { } struct Str
我的测试用例是这样的: class FooTest extends PHPUnit_Framework_TestCase { /** @covers MyClass::bar */ f
我正在尝试将brew install wine作为使electron-builder工作的一步。但是我所能得到的只是以下响应: ==> Installing dependencies for wine
我这样做: string[,] string1 = {{"one", "0"},{"Two", "5"},{"Three","1"}}; int b = 0; for(int i = 0; i <=
我正在尝试使用 SetWindowsHookEx 键盘 Hook Notepad.exe。 如您所见,工作线程正在将其 ASCII 代码(即 wParam)发送到指定的服务器。 UINT WINAPI
我正在尝试将 ListView 实现到我的 Fragment 中,但无论我尝试什么,我都会得到一个 NullPointerException。我检查对象是否为 null 并记录是否为 null,看起来
我尝试在一行中对齐两个 div。使用 float left 属性,一切顺利。但是当我在 div 中使用图像时,它开始产生问题。 所以这是我的示例代码:- Some headi
我目前正在使用此代码来获取图像的灰度图像表示并以 (512, 370, 1) 的格式表示它大批。 img_instance = cv2.imread(df.iloc[i][x_col]) / 255.
总结 我正在创建一个简单的应用程序,它允许用户选择一个包含顶级窗口的进程。用户首先键入 native DLL(而非托管 DLL)的路径。然后用户键入将在 Hook 过程中调用的方法的名称。该方法不得返
我是一名优秀的程序员,十分优秀!