需要在MongoDB和golang中使用$ push包含$ each和$ position(mgo)

时间:2016-08-26 08:01:39

标签: mongodb go mgo

1.在后端我使用go lang和数据库我使用mongoDB。我试图找到嵌入数组中插入的最后一个文档,这样我就可以在不知道其索引的情况下检索最后一个数组索引中的文档。这是可能的吗? 在研究了这个之后,我才知道它不可能。所以我想使用$ push,$ each和$ position.Here我可以将位置设置为0,这样新添加的文档将在0中,所以我可以使用它来检索它指数0。

  Here is bson format
    {
    empid:"L12"
    AnnualLeave:[
        {
        "atotal" : 20,
        }
    ]
    }



 Here is my schema


 type (
            Employee struct {
                EmpId          string
                AnnualLeave    []*AnnualLeaveInfo
            }
             AnnualLeaveInfo struct {
                ATotal          int64   
            }


        I use the mgo statement as follows`enter code here`

 c.Update(bson.M{"empid": "string"}, bson.M{"$push": bson.M{"annualleave":bson.M{"$each":
         bson.M{"atotal": 4},"$position":0}}

2.请告诉我如何减少所附文件的ATotal,并将其保留为新文件的总值。 请帮帮我。谢谢

1 个答案:

答案 0 :(得分:1)

  

我试图找到嵌入数组中插入的最后一个文档,这样我就可以在不知道索引的情况下检索最后一个数组索引中的文档。这是可能的吗?

您可以通过从数组长度中获取最后一个数组索引。使用您的示例:

type Employee struct {
        EmpId string 
        AnnualLeave []AnnualLeaveInfo
}
type AnnualLeaveInfo struct {
        ATotal int64
}

result := Employee{}
err = c.Find(bson.M{"empid": "example employee ID"}).One(&result)
if err != nil {
        log.Fatal(err)
}
lastAnnualTotal:= result.AnnualLeave[len(result.AnnualLeave)-1].ATotal
  

请告诉我如何减少附加的上一份文件的ATotal并将其保留为新文件总数的值

根据您的使用情况,您可以尝试执行两个数据库操作:

  • 从集合中获取最后一个ATotal值。
  • 使用新的AnnualLeaveInfo值推送新的ATotal文档。
// Assuming that EmpId is unique
err = c.Update(bson.M{"empid": result.EmpId},
      bson.M{"$push": bson.M{"annualleave": bson.M{"atotal": int(latestAnnualTotal-1)}}})

如果您需要原子更新,请参阅Model Data for Atomic OperationsCQRS design patterns

另一方面,您似乎正在尝试执行与Even Sourcing with MongoDB相关的操作。这种设计模式可能有助于计算年假用例。另请参阅{{3}}