【发布时间】:2017-01-17 06:45:16
【问题描述】:
我有字段相同的父记录和子记录。但是,某些字段仅设置在父级。
设置为空字符串 ("") 的父字段表示该记录是父记录。其他记录具有指向父记录的值集,因此这些记录可以被视为子记录。
现在考虑以下记录:
{"_id": 1, parent: "", "pValue": ["a", "b", "c"], fieldA: 2},
{"_id": 2, parent: 1, "pValue": [], fieldA: 2},
{"_id": 3, parent: 1, "pValue": [], fieldA: 2},
{"_id": 4, parent: "", "pValue": ["d"], fieldA: 9},
{"_id": 5, parent: 4, "pValue": [], fieldA:2},
{"_id": 6, parent: 4,"pValue": [], fieldA: 9}
上述记录包含两个父母,每个父母都有 2 个关联的子记录。我尝试执行的查询涉及匹配两个给定的参数。首先是 pValue 上的一个值。一旦我在他们的数组中获得具有特定 pValue 的所有父母。然后,我想将该父项及其关联的所有子记录与 fieldA 值匹配。
所以如果给定 pValue="d" 和 fieldA=9 我希望光标内有以下记录:
{"_id": 4, parent: "", "pValue": ["d"], fieldA: 9}
{"_id": 6, parent: 4, "pValue": [],fieldA: 9}
注意事项:
- 每个父级可以有许多与其关联的子级。
- 父级可以为子级设置不同的 fieldA 值,并且查询应该只返回子级而不是父级
我的尝试:
cursor=self.pCollection.aggregate([
{ "$match": {"pValue":{"$in":[pCheck]}},
{ "$graphLookup" : {
"from": "pCollection",
"startWith": "$_id",
"connectFromField": "_id",
"connectToField": "parent",
"as" : "children"
}
}])
然后,我被困在所有与父级关联的子级数组中,却不知道如何对它们进行向上包装。
【问题讨论】:
-
你能显示预期的结果吗?
-
嗨 Styvane,说我想在 fieldA=2 上匹配结果将只是记录 {"_id":3,"fieldA":2,"fieldB":8,"pValue": ["a","b"],parent:1} 但是它需要首先通过graphLookup
-
此外,如果父记录的 fieldA 值也为 2,它将返回两条记录,即父母和孩子
-
好的,请编辑您的问题以添加具有预期结果的示例文档。
标签: python mongodb aggregation-framework