2016-08-26 14 views
1

1.バックエンドではgo langを使い、データベースにはmongoDBを使います。私は、インデックスを知らずに最後の配列インデックスでドキュメントを取得できるように、埋め込み配列に挿入された最後のドキュメントを検索しようとしています。可能ですか? これを調べた後、私はそれが不可能であることを知りました。私は$ push、$ each、$ positionを使って考えています。私は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.Pleaseを使用するだけでなく添付前の文書のATotalをデクリメントし、新しい文書のatotalの値として、それを維持する方法を私にアドバイス。 私はそのindex.Isを知らなくても、最後の配列インデックスに文書を取り出すことができるように埋め込まれた配列に挿入された最後のドキュメントを検索しようとmはme.Thanks

答えて

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の値として、それを維持する方法にも私にアドバイスをしてくださいあなたのユースケースでは、2つのデータベース操作を実行することができます:

  • 最後にをフェッチしてくださいコレクションの値。
  • 新しいAnnualLeaveInfo文書を新規の値でプッシュします。
// 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)}}}) 

あなたはアトミックな更新が必要な場合は、MongoDB Atomicity and TransactionsModel Data for Atomic Operationsを参照してください。

また、CQRS design patternsに関することをやっているようです。このデザインパターンは、あなたの年次休暇の使用事例の計算に役立ちます。また、Even Sourcing with MongoDB

+0

ありがとうございました......あなたのアドバイスに従って解決しました.... –

関連する問題