2016-09-13 2 views
0

私はバックエンドでgolangを、データベースとしてmongoDBを使用しています。埋め込み配列の1つからドキュメントを取得しようとすると、その結果として埋め込み配列のインデックスが1つしか取得されません。mgo(golang + MangoDB)の組み込み配列から要素を取得する

私の構造体は、マイgolangコードは、私は休暇の唯一のインデックス0を取得mは

t := time.Date(2016, 10, 1, 0, 0, 0, 0, time.UTC) 
    var result []*Employee 
     if e := c.Find(nil).Select(bson.M{"leave": bson.M{ 
      "$elemMatch": bson.M{ 
       "from": bson.M{ 
       "$gte":t, 
    }, 
      }, 
     }, 
     }, 
     ).All(&result); e != nil { 
      fmt.Println(e) 
} 

私のデータベース構造はこの中

_id:57d7a6673897593ae84bed49{ 
Name:"Mark" 
EmpId:"E123" 
Password:1234 
Leave:[ 
{ 
    "id" : 0, 
    "days" : 1.5, 
    "from" : ISODate("2016-12-01T00:00:00Z"), 
    "to" : ISODate("2016-12-02T12:00:00Z"), 
    "applieddate" : ISODate("0001-01-01T00:00:00Z"), 
    "status" : "Approved", 
    "approveddate" : ISODate("0001-01-01T00:00:00Z"), 

    }, 
{ 

    "id" : 1, 
    "days" : 2.0, 
    "from" : ISODate("2016-12-11T00:00:00Z"), 
    "to" : ISODate("2016-12-12T00:00:00Z"), 
    "applieddate" : ISODate("0001-01-01T00:00:00Z"), 
    "status" : "Approved", 
    "approveddate" : ISODate("0001-01-01T00:00:00Z"), 

    }, 
] 
} 

であるこの

よう
type (
    Employee struct { 
     Name   string 
     EmpId   string 
     Password  string 
     Leave  []*LeaveInfo 
    } 
LeaveInfo struct { 

     Id    int 
     Days   float64 
     From   time.Time 
     To    time.Time 
     AppliedDate  time.Time 
     Status   string 
     ApprovedDate time.Time 
    } 

ですあなたが見ることができる配列の両方のインデックスは、私はそれを取得するときt.Butより大きい日付を持っているEX(インデックス0)は.But私は必要なのt.Pleaseヘルプme.thanksよりも大きい日付を持っているすべてのインデックスを盗んことです

{ 
    "Name": "", 

    "EmpId": "", 
    "Password": "", 
"Leave": [ 
     { 

     "Id": 0, 
     "Days": 1.5, 
     "from" : ISODate("2016-12-01T00:00:00Z"), 
     "to" : ISODate("2016-12-02T12:00:00Z"), 
     "applieddate" : ISODate("0001-01-01T00:00:00Z"), 
     "status" : "Approved", 
     "approveddate" : ISODate("0001-01-01T00:00:00Z"), 
     } 
    ] 
} 
+0

あなたがより良い必要な「残す」をフィルタリングする配列と '$のmatch'を展開するために' $のunwind'を使用したいからそこには – Anzel

+0

ありがとうございます。実装し、希望の結果を得ました。今すぐ答えを投稿してください。ありがとう –

答えて

1

私は何それを確認していない、次のように私の結果は、あなたは単一のモンゴーの質問で可能です。私はむしろこのような何かで行くには、すべての 要素とフィルタを得るでしょう:

var result []*Employee 
err := c.Find(nil).All(&result) 
if err != nil { 
    // do stuff... 
} 

// For each result, filter the Leave values having a to small From value. 
t := time.Date(2016, 10, 1, 0, 0, 0, 0, time.UTC) 
for i := range result { 
    var j int 
    for j < len(result[i].Leave) { 
     if result[i][j].From.Before(t) { 
      result[i] = append(result[i][:j], result[i][j+1:]...) 
      continue 
     } 
     j++ 
    } 
}  
+0

返信いただきありがとうございます。$ unwind、$ match、$ projectを実装することでこれが実現しました。もう一度あなたの努力に感謝します.....私は今私の答えを掲示するでしょう。ありがとう –

関連する問題