1

Following is the data

[
  {
    "_id": {
      "$oid": "6364f2eee35fc06fa06afb5f"
    },
    "type": "subbranch",
    "parent_id": "635116c18fe4294398842ebb",
    "org_name": "Pune - Delhi"
  },
  {
    "_id": {
      "$oid": "635116c18fe4294398842ebb"
    },
    "type": "branch",
    "org_name": "Delhi Branch",
    "parent_id": "0"
  }
]

query which i have written is as follows

// req.params.id is 6364f2eee35fc06fa06afb5f
let id = mongoose.Types.ObjectId(req.params.id);
        let data = await organisation.aggregate([
            {
                $addFields: { "_idString": { "$toString": "$_id" }}
            },
            {
                $graphLookup: {
                   from: "organisations",
                   startWith: "$parent_id",
                   connectFromField: "parent_id",
                   connectToField: "_idString",
                   as: "parent"
                }
            },
            {
                $match: {_id: id}
            },
        ]);

but in output i get as follow

[
  {
    "_id": "6364f2eee35fc06fa06afb5f",
    "type": "subbranch",
    "parent_id": "635116c18fe4294398842ebb",
    "org_name": "Pune - Delhi",
    "_idString": "6364f2eee35fc06fa06afb5f",
    "parent": [

    ]
  }
]

i am getting empty parent array but expected output is array with parent data in it. any suggestion would be appreciated.

conrad
  • 51
  • 8
  • 1
    This will not work as your second step, `$graphLookup` is using the **original** collection, not the collection after step one, thus the documents you are trying to connect have no `_idString`. How many levels do you need? Can you use `$lookup` instead? – nimrod serok Nov 07 '22 at 07:10

1 Answers1

2

Remember connectFromField expected or extracted from current aggregated collection while connectToField is connected to from orginal collection

DEMO ON https://mongoplayground.net/p/vYDdOgNt9bW

The aggregate query be like

db.collection.aggregate([
  {
    $addFields: {
      "parent_id": {
        $convert: {
          input: "$parent_id",
          to: "objectId",
          onError: "$parent_id",
        }
      }
    }
  },
  {
    $graphLookup: {
      from: "collection",
      startWith: "$parent_id",
      connectFromField: "parent_id",
      connectToField: "_id",
      as: "parent"
    }
  }
])

Outputs

[
  {
    "_id": ObjectId("6364f2eee35fc06fa06afb5f"),
    "org_name": "Pune - Delhi",
    "parent": [
      {
        "_id": ObjectId("635116c18fe4294398842ebb"),
        "org_name": "Delhi Branch",
        "parent_id": "0",
        "type": "branch"
      }
    ],
    "parent_id": ObjectId("635116c18fe4294398842ebb"),
    "type": "subbranch"
  },
  {
    "_id": ObjectId("635116c18fe4294398842ebb"),
    "org_name": "Delhi Branch",
    "parent": [],
    "parent_id": "0",
    "type": "branch"
  }
]
Naveen
  • 246
  • 1
  • 8