0

I m using go lang as the back end of my application and mongoDB as the database.I am facing a problem where i compare the name and project the leave array and inside that i also need to project the certificates for that leave.Since i need only little info from the employee struct i wanted to implement using pipe and project.

 type (
        Employee struct {
            Name               string
            Password           string
           EmailAddress       string
           Position           string
           Gender             string
           Nationality        string
           Department         string
           MaritalStatus      string
           Approvedby         string
           JoinDate           time.Time
           ConfirmationDate   time.Time
           EndDate            time.Time
            Leave             []*LeaveInfo  
        }
        LeaveInfo struct {
            Total        float64
            Id           int
            Days         float64
            From        time.Time
             To          time.Time  
            Status       string
            Certificate  []*CertificateInfo
        }
        CertificateInfo struct {
            FileName string
            FileType string
            FileSize int

        }

The database structure is as follows

{
    "_id" : ObjectId("58213e14927a62f3cf04e05b"),
    "name" : "string",
    "password" : "string",
    "emailaddress" : "string",
    "position" : "string",
    "gender" : "string",
    "maritalstatus" : "string",
    "approvedby" : "string",
    "nationality" : "german",
    "department" : "account",
    "joindate" : ISODate("2016-09-19T00:00:00.000Z"),
    "confirmationdate" : Date(-62135596800000),
    "enddate" : Date(-62135596800000),
    "Leave" : [ 
        {
            "total" : 20.0,
            "id" : 0,
            "days" : 0.0,
            "type" : "",
            "from" : ISODate("2016-12-12T00:00:00.000Z"),
            "to" : ISODate("2016-12-12T00:00:00.000Z"),
            "status" : "",
            "certificate" : [
                    {
                    "filename" : "malaysia",
                    "filetype" : ".zip",
                    "filesize" : 1234
                }, 
                {
                    "filename" : "singapore",
                    "filetype" : ".zip",
                    "filesize" : 1234
                }
             ]
        }, 
        {
            "total" : 19.0,
            "id" : 1,
            "days" : 1.0,

            "from" : ISODate("2016-12-12T00:00:00.000Z"),
            "to" : ISODate("2016-12-12T00:00:00.000Z"),
            "applieddate" : ISODate("2016-11-08T02:53:38.902Z"),
            "status" : "Processing",
            "approveddate" : Date(-62135596800000),
            "certificate" : [ 
                {
                    "filename" : "germany",
                    "filetype" : ".zip",
                    "filesize" : 1234
                }, 
                {
                    "filename" : "england",
                    "filetype" : ".zip",
                    "filesize" : 1234
                }
            ]
        }, 
        {
            "total" : 18.0,
            "id" : 2,
            "days" : 1.0,
            "mdays" : 0.0,
            "type" : "annualleave",
            "daytype" : "FullDay",
            "from" : ISODate("2016-12-12T00:00:00.000Z"),
            "to" : ISODate("2016-12-12T00:00:00.000Z"),
            "applieddate" : ISODate("2016-11-08T05:36:21.579Z"),
            "status" : "Processing",
            "approveddate" : Date(-62135596800000),
            "certificate" : [
                   {
                    "filename" : "india",
                    "filetype" : ".zip",
                    "filesize" : 1234
                   }, 
                   {
                    "filename" : "france",
                    "filetype" : ".zip",
                    "filesize" : 1234
                   }
                 ]
             }
         ]
     }

My code in golang is as follows

pipe3 := c.Pipe([]bson.M{
            {
                "$match": bson.M{

                   "name":name
                 },
            },
            {
                "$unwind": "$leave",
            },

            {
                "$project": bson.M{
                    "_id":          false,

                    "name":         1,
                    "Id":           "$leave.id",
                    "Total":        "$leave.total",
                    "Days":         "$leave.days",
                    "Status":       "$leave.status",
                },
            },
       })

The problem here is i dont know how to retrieve all the info of the certificates related to that particular leave.Please note that the certificate is an array with atleast two index in it...

I need an output similar to this. 
                    "name":        "John",
                    "Id":           "1",
                    "Total":        "10.0",
                    "Days":         "2.0",
                    "Status":       "Process",
                    "Certificate" : [
                      {
                     "filename":"certificate1",
                     "filesize":"size1"
                     },
                    {
                        "filename":"certificate2",
                        "filesize":"size2"
                     }
                      ]


                 "name":        "John",
                "Id":           "2",
                "Total":        "8.0",
                "Days":         "2.0",
                "Status":       "Process",
                "Certificate" : [
                  {
                 "filename":"certificate1",
                 "filesize":"size1"
                 },
                {
                    "filename":"certificate2",
                    "filesize":"size2"
                 }
                  ]

Is this possible using project.or is there any other way to do this.Appreciate any help.Please.Thanks

1
  • Add "Certificate": "$Leave.certificate" in your $project stage Commented Nov 8, 2016 at 11:50

1 Answer 1

1

Using on your document structure example above, you just have to expose certificate through $project as below:

pipeline := []bson.M{
                {"$match": bson.M{"name":"string"}},
                {"$unwind": "$Leave"},
                {"$project": bson.M{
                        "_id":          false,
                        "name":         1,
                        "Id":           "$Leave.id",
                        "Total":        "$Leave.total",
                        "Days":         "$Leave.days",
                        "Status":       "$Leave.status",
                        "Certificate":  "$Leave.certificate"},
                },
           }
pipe := collection.Pipe(pipeline)
response := []bson.M{}
err = pipe.All(&response)

As you already use $unwind on Leave, you have individual documents per leave request. The output of the above aggregation would be:

 {
  "name": "string",
  "Id": 0,
  "Total": 20,
  "Days": 0,
  "Status": "",
  "Certificate": [
    {
      "filename": "malaysia",
      "filetype": ".zip",
      "filesize": 1234
    },
    {
      "filename": "singapore",
      "filetype": ".zip",
      "filesize": 1234
    }
  ]
},
{
  "name": "string",
  "Id": 1,
  "Total": 19,
  "Days": 1,
  "Status": "Processing",
  "Certificate": [
    {
      "filename": "germany",
      "filetype": ".zip",
      "filesize": 1234
    },
    {
      "filename": "england",
      "filetype": ".zip",
      "filesize": 1234
    }
  ]
},
{
  "name": "string",
  "Id": 2,
  "Total": 18,
  "Days": 1,
  "Status": "Processing",
  "Certificate": [
    {
      "filename": "india",
      "filetype": ".zip",
      "filesize": 1234
    },
    {
      "filename": "france",
      "filetype": ".zip",
      "filesize": 1234
    }
  ]
}

Where each leave request, has their own corresponding certificates associated with the leave.

Sign up to request clarification or add additional context in comments.

3 Comments

Thanks for helping me ...Sorry....My certificate is not displaying if i use like this...I m only getting the values of leave....and have one more doubt..If i dont check the name and just display the details of all the employees with their details in the format which i asked for,is it possible....
I used your example document exactly as you posted, so if you don't get the same result, it's something to do with your code. Check the capitalisation of $leave vs $Leave. Failing that, post your input documents, and exact output of the code above. I don't understand your second question, could you elaborate that with examples .
Thanks...I did something wrong in my code.After rectifying it its working.Thanks very much.....I will give your answer as the right one.Once again thanks...

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.