Извлечение элементов из встроенного массива в 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++
}
}