нужно проецировать вложенный массив с помощью mgo

Я использую go lang в качестве серверной части моего приложения и mongoDB в качестве базы данных. Я столкнулся с проблемой, когда я сравниваю имя и проецирую массив выходных данных, и внутри этого мне также нужно спроецировать сертификаты для этого отпуска. Поскольку мне нужно только небольшая информация из структуры сотрудника, которую я хотел реализовать, используя канал и проект.

 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

        }

Структура базы данных следующая

{
    "_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
                   }
                 ]
             }
         ]
     }

Мой код в golang выглядит следующим образом

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",
                },
            },
       })

Проблема здесь в том, что я не знаю, как получить всю информацию о сертификатах, связанных с этим конкретным отпуском. Обратите внимание, что сертификат представляет собой массив с как минимум двумя индексами в нем...

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"
                 }
                  ]

Возможно ли это с помощью проекта или есть ли другой способ сделать это. Благодарим за любую помощь. Пожалуйста. Спасибо.


person Rajesh Kumar    schedule 08.11.2016    source источник
comment
Добавить сертификат: $Leave.certificate на этапе $project   -  person Parshuram Kalvikatte    schedule 08.11.2016


Ответы (1)


Используя приведенный выше пример структуры документа, вам просто нужно выставить certificate через $project, как показано ниже:

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)

Поскольку вы уже используете $unwind в Leave, у вас есть отдельные документы для каждого запроса на отпуск. Результатом вышеуказанной агрегации будет:

 {
  "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
    }
  ]
}

Где каждый запрос на отпуск имеет свои собственные соответствующие сертификаты, связанные с отпуском.

person Wan Bachtiar    schedule 08.11.2016
comment
Спасибо, что помогли мне ... Извините ... Мой сертификат не отображается, если я использую это ... Я получаю только значения отпуска .... и у меня есть еще одно сомнение ... Если я не проверю имя и просто отображать данные всех сотрудников с их данными в том формате, который я просил, возможно ли это.... - person Rajesh Kumar; 08.11.2016
comment
Я использовал ваш пример документа точно так, как вы опубликовали, поэтому, если вы не получите тот же результат, это как-то связано с вашим кодом. Проверьте заглавные буквы $leave и $Leave. В противном случае опубликуйте свои входные документы и точный вывод кода выше. Я не понимаю ваш второй вопрос, не могли бы вы уточнить его с примерами. - person Wan Bachtiar; 08.11.2016
comment
Спасибо ... Я сделал что-то не так в своем коде. После исправления он заработал. Большое спасибо ..... Я дам ваш ответ как правильный. Еще раз спасибо ... - person Rajesh Kumar; 09.11.2016