2016-09-13 6 views
0

Я использую golang в бэкэнд и mongoDB как базу данных. Когда я пытаюсь получить документы из одного из встроенных массивов, я получаю только один индекс встроенного массива в результате в результате.Извлечение элементов из встроенной матрицы в mgo (golang + MangoDB)

Моя структура подобна этой

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 
    } 

Мой golang код

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 из отпуска array.As вы можете видеть, что и индекс массива имеет дату, большую, чем t. Но когда я возвращаюсь, я получаю только один индекс ех (индекс 0). то, что мне нужно, чтобы извлечь весь индекс, который имеет даты больше, чем T.Please помощи me.thanks

Мой результат заключается в следующем

{ 
    "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"), 
     } 
    ] 
} 
+0

Вы бы лучше использовать '$ unwind' развернуть массив и' $ match' отфильтровывать искомый «уйти» от там на – Anzel

+0

Thanks.Implemented и получил желаемый результат. Отправляю ответ сейчас. Спасибо –

ответ

1

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

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++ 
    } 
}  
+0

Спасибо за ваш ответ. Я обнаружил, что, реализуя $ unwind, $ match, $ project, это может быть реализовано. Теперь у меня есть результат что мне нужно. Еще раз спасибо за ваши усилия ..... Я отправлю свой ответ сейчас. Спасибо. –