douyujun0152 2016-11-08 03:36
浏览 17
已采纳

需要使用mgo投影嵌套数组

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条回答 默认 最新

  • dstxpei5823 2016-11-08 08:41
    关注

    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.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?