鉴于以下文件:
{ _id : "1", groups : [ "2", "3" ] }
{ _id : "2", groups : [ ] }
{ _id : "3", groups : [ "4" ], users : [ "a" ] }
{ _id : "4", groups : [ ] }
我想找到用户“a”所属的所有组,所以查询结果应该是1
和3
,因为组1
包含组3
(其中包含用户),而组3
直接包含用户。
我考虑过使用graphLookup
,但这行不通,因为我不知道哪些组可能包含该用户。理论上,我考虑过类似这样的方法:
- 对于每个组,传递地找到用户“a”。
- 如果匹配,则返回进程中的所有组ID。
- 结尾很明显。
我不知道如何在Mongo中实现这样的功能,也不知道我的理论是否正确。这是我目前所做的,但它只返回直接包含用户的组:
db.getCollection('groupstest').aggregate([
{
$graphLookup: {
from: "groupstest",
startWith: "$allGroups._id",
connectFromField: "groups",
connectToField: "_id",
as: "allGroups",
maxDepth: 100,
},
},
{ $unwind: "$allGroups" },
{ $match: { "allGroups.users": "a" } },
{
$group: {
_id: null,
allGroupsIds: { $addToSet: "$allGroups._id" },
},
},
{ $project: { _id: 0, allGroupsIds: 1 } },
]);
1条答案
按热度按时间nx7onnlm1#
也许我们可以“倒着”思考,我们可以从包含用户a的组开始,然后,我们可以
$graphLookup
回到包含那些组的父组,使用$reduce
迭代查找结果,并使用$setUnion
将路径放入一个数组中。Mongo Playground