Извлечение элементов из встроенного массива в mgo(golang+MangoDB)

Я использую golang в бэкэнде и mongoDB в качестве базы данных. Когда я пытаюсь получить документы из одного встроенного массива, в результате я получаю только один индекс встроенного массива.

Моя структура такая

type (
    Employee struct {
        Name           string
        EmpId          string
        Password       string
        Leave        []*LeaveInfo
    }
LeaveInfo struct {

        Id              int
        Days            float64
        From            time.Time
        To              time.Time
        AppliedDate     time.Time
        Status          string
        ApprovedDate    time.Time
    }

Мой код Голанга

   t := time.Date(2016, 10, 1, 0, 0, 0, 0, time.UTC)
    var result []*Employee
        if e := c.Find(nil).Select(bson.M{"leave": bson.M{
            "$elemMatch": bson.M{
                "from": bson.M{
               "$gte":t, 
    },
            },
        },
        },
        ).All(&result); e != nil {
            fmt.Println(e)
}

Моя структура базы данных

_id:57d7a6673897593ae84bed49{
Name:"Mark"
EmpId:"E123"
Password:1234
Leave:[
{
    "id" : 0,
    "days" : 1.5,
    "from" : ISODate("2016-12-01T00:00:00Z"),
    "to"   : ISODate("2016-12-02T12:00:00Z"),
    "applieddate" : ISODate("0001-01-01T00:00:00Z"),
    "status" : "Approved",
    "approveddate" : ISODate("0001-01-01T00:00:00Z"),

  },
{

    "id" : 1,
    "days" : 2.0,
    "from" : ISODate("2016-12-11T00:00:00Z"),
    "to" : ISODate("2016-12-12T00:00:00Z"),
    "applieddate" : ISODate("0001-01-01T00:00:00Z"),
    "status" : "Approved",
    "approveddate" : ISODate("0001-01-01T00:00:00Z"),

  },
]
}

В этом я получаю только индекс 0 массива Leave. Как вы можете видеть, оба индекса массива имеют дату больше, чем t. Но когда я получаю его, я получаю только один индекс (индекс 0). Но что мне нужно чтобы получить все индексы, дата которых больше, чем t. Пожалуйста, помогите мне. Спасибо

Мой результат таков

{
    "Name": "",

    "EmpId": "",
    "Password": "",
"Leave": [
      {

        "Id": 0,
        "Days": 1.5,
        "from" : ISODate("2016-12-01T00:00:00Z"),
        "to"   : ISODate("2016-12-02T12:00:00Z"),
        "applieddate" : ISODate("0001-01-01T00:00:00Z"),
        "status" : "Approved",
        "approveddate" : ISODate("0001-01-01T00:00:00Z"),
      }
    ]
}

1 ответ

Я не уверен, что то, что вы спрашиваете, возможно в одном монго-запросе. Я предпочел бы получить все элементы и фильтр с чем-то вроде этого:

var result []*Employee
err := c.Find(nil).All(&result)
if err != nil {
    // do stuff...
}

// For each result, filter the Leave values having a to small From value.
t := time.Date(2016, 10, 1, 0, 0, 0, 0, time.UTC)
for i := range result {
    var j int
    for j < len(result[i].Leave) {
        if result[i][j].From.Before(t) {
            result[i] = append(result[i][:j], result[i][j+1:]...)
            continue
        }
        j++
    }
}       
Другие вопросы по тегам