2016-11-11 4 views
1

В конце концов я использую go lang, а для базы данных я использую mongoDB. Я пытаюсь найти последний документ, вставленный во встроенный массив, поэтому я могу получить документ в последнем индексе массива, не зная его index.Right теперь im получить все документы сотрудника, а затем найти последний index.It, как перегрузка мой RAM, как мне нужно, чтобы получить 1000 записи сотрудника и хранить его в оперативной памяти, прежде чем найти последний индекс массива Моя структура выглядит следующим образом, чтобы найти последний индекс массива в mongodb

type (
     Employee struct { 
      Name    string 
      Password   string 
      EmpId    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 

     } 

Вот как я делаю в моем приложении

My code is follows 

    employee := Employee{} 
    err = c.Find(bson.M{ 
        "empid": "1234" 
       }).One(&result) 
    if err != nil { 
      log.Fatal(err) 
    } 
      name:=result.Name   
      lastindex:= result.LeaveInfo[len(result.LeaveInfo)-1].Id 

Как вы можете видеть, я извлекаю все данные о сотрудниках, а затем нахожу Идентификатор последнего документа. Есть ли какая-либо ставка эр способ сделать this.Appreciate любой help.Please ... Спасибо ..

Недавно добавленные Коды

This code is based on your example 

    var result bson.M 

    query := bson.M{"empid": "1234"} // gets the employee you are interested in 
    match := bson.M{"$match": query} // Set up the match part of the pipeline 
    unwind := bson.M{"$unwind": "$leave"} // sets up the leave field to be unwound 

    pipeline := []bson.M{match, unwind,{ 
    "$project":bson.M{ 
      "ID":bson.M{ 
       "$slice": []interface{}{"$leave.id", -1}, 
     } 
     } 


    iter := postCollection.Pipe(pipeline).Iter() 
    for iter.Next(&result) { 
     fmt.Printf("%+v\n", result) 
    } 
    iter.Close() 

Этот код дает мне много того же документа, как 542 документов .Но все эти документ тот же ...

ответ

1

Если вы используете версию Mongo, которая имеет $ slice в ней, она была введена в 2.4, вы можете использовать ее в Find с добавлением функции Select, которая работает как проект ,

err = c.Find(bson.M{"empid": "1234"}).Select(bson.M{"name": 1, "leave": bson.M{"$slice": -1}}).One(&result) // result is an Employee struct 

В противном случае агрегация - ваш друг. Вам нужно использовать конвейер и отключить поле «Отпуск сотрудников».

Есть несколько простых шагов:

1) Определить запись результатов на основе вашей записи Сотрудника, где поле Leave определяется как единый LeaveInfo, а не кусочек LeaveInfos, например

EmployeeResult struct { 
    Name string `bson:"name"` 
    Leave LeaveInfo `bson:"leave"` 
} 

Не забудьте сделать тег bson тем же именем, что и тег LeaveInfo в структуре Employee.

2) Затем создать конвейер с парой этапов:

query := bson.M{"empid": "1234"} // gets the employee you are interested in 
match := bson.M{"$match": query} // Set up the match part of the pipeline 
unwind := bson.M{"$unwind": "$leave"} // sets up the leave field to be unwound 
pipeline := []bson.M{match, unwind} // the pipeline you are passing to pipe. I like to split the parts of the pipe call up for clarity and ease of later modification 

3) Позвоните трубы с трубопроводом в качестве параметра, то Iter над результатами, это должно дать вам один LeaveInfo в то время

var (
    result EmployeeResult 
) 
iter := postCollection.Pipe(pipeline).Iter() 
for iter.Next(&result) { 
    fmt.Printf("%+v\n", result) 
} 
iter.Close() 

4) В конце цикла результат будет иметь последний элемент в списке или быть пустым, если ничего не было прочитано.

+0

Спасибо user1638680 ..... Есть ли другой атрибут в mongodb, который помогает нам находить наименьший индекс. Это определенно лучше, чем мой код, но я не хочу, чтобы 1000 записей остаточного массива были извлечены внутри ram для каждого запроса, даже если мы просто извлекаем только два атрибута массива leave.Thanks ... Еще раз спасибо за вашу помощь. –

+0

В Mongo 3.2 вы можете использовать $ slice с отрицательным числом из оболочки Mongo, например – dgm

+0

Упс, я нажал преждевременно. С оболочкой Mongo вы можете запустить запрос типа: db.c.find ({"empid": "1234"}, {"leave": {$ slice: -1}}) и получить последнюю запись в массиве. Я быстро посмотрел и не нашел примеров использования $ slice от Go. – dgm

Смежные вопросы