0

How to get the count of all the child nodes recursively with the condition?

I have the structure of a collection like this:

| id | parentID    | type   |
-----------------------------
| 1  | NULL        | A      |
-----------------------------
| 2  | 1           | B      |
-----------------------------
| 3  | 1           | B      |
-----------------------------
| 4  | 2           | C      |
-----------------------------
| 5  | 2           | C      |
-----------------------------
| 6  | 2           | B      |
-----------------------------

And wanted an Output like this:

[
        {
            "id": 1,
            "parentId": null,
            "type": "A",
            "childBCount": 3
        },
        {
            "id": 2,
            "parentId": 1,
            "type": "B",
            "childBCount": 1
        },
        {
            "id": 3,
            "parentId": 1,
            "type": "B",
            "childBCount": 0
        },
        {
            "id": 4,
            "parentId": 2,
            "type": "C",
            "childBCount": 0
        },
        {
            "id": 5,
            "parentId": 2,
            "type": "C",
            "childBCount": 0
        },
        {
            "id": 6,
            "parentId": 2,
            "type": "C",
            "childBCount": 0
        }
    ]

I have tried using graphlookup but it did't provide me the option to add condition to graphlookup stage.

I have using the query like below

modelName.aggregate([
    {
        $graphLookup: {
            from: "modelName",
            startWith: "$id",
            connectFromField: "id",
            connectToField: "parentId",
            as: "children",
        },
    }
])
.allowDiskUse(true);

But wanted something like this where i can add condition to graphlookup stage

modelName.aggregate([
    {
        $graphLookup: {
            from: "modelName",
            startWith: "$id",
            connectFromField: "id",
            connectToField: "parentId",
            as: "children",
            match:[
                {
                    type:"B"
                }
            ]
        },
    }
])
.allowDiskUse(true);
yedpodtrzitko
  • 9,035
  • 2
  • 40
  • 42
Prakash Naidu
  • 742
  • 2
  • 7
  • 17

1 Answers1

1

$graphLookup has the following prototype form:

{
   $graphLookup: {
      from: <collection>,
      startWith: <expression>,
      connectFromField: <string>,
      connectToField: <string>,
      as: <string>,
      maxDepth: <number>,
      depthField: <string>,
      restrictSearchWithMatch: <document>
   }
}

Here <document> follows the usual query filter syntax with the caveat that you cannot use aggregation expressions.

Therefore, you can add your condition to restrictSearchWithMatch property as follows:

modelName.aggregate([
    {
        $graphLookup: {
            from: "modelName",
            startWith: "$id",
            connectFromField: "id",
            connectToField: "parentId",
            as: "children",
            restrictSearchWithMatch: { "type": "B" }
        },
    }
])
.allowDiskUse(true);
EmirDev
  • 87
  • 5