在mongodb

时间:2016-11-11 09:19:45

标签: mongodb go mgo

在后端我使用go lang而对于数据库我使用mongoDB。我试图找到插入嵌入式数组中的最后一个文档,这样我就可以在不知道索引的情况下检索最后一个数组索引中的文档。现在我得到了员工的所有文档,然后找到最后一个索引。就像重载一样我的RAM因为我需要检索1000个员工记录并在找到数组的最后一个索引之前将其存储在ram中 我的结构如下

 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

正如你所看到我检索整个员工数据然后找到最后一个文件的ID。有没有更好的方法来做到这一点。感谢任何帮助。请...谢谢..

  

新增代码

 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 个答案:

答案 0 :(得分: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

否则,聚合是你的朋友。您需要使用管道并展开Employee Leave字段。

有几个简单的步骤:

1)根据您的员工记录定义结果记录,其中Leave字段被定义为单个LeaveInfo而不是LeaveInfos片段,例如

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

不要忘记让bson标记与Employee结构中的LeaveInfo标记同名。

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)使用管道作为参数调用Pipe然后对结果进行迭代,这应该一次给你一个LeaveInfo

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

4)在循环结束时,结果将包含列表中的最后一项,或者如果没有读取任何内容则为空。