在后端我使用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个文件。但是所有这些文件都是一样的......
答案 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)在循环结束时,结果将包含列表中的最后一项,或者如果没有读取任何内容则为空。