2017-08-17 16 views
0

mgoでパイプを実行するときはbson名が使用されます。 構造体:MGOはjsonフィールドの代わりにbsonフィールドを返します

type Training struct { 
    Id     bson.ObjectId `json:"id" bson:"_id"` 
    Name    string   `json:"name" bson:"name"` 
    Description   string   `json:"description"` 
    Level    *TrainingLevel `json:"level"` 
    Preworks   []bson.ObjectId `json:"preworks"` 
    PrePostTests  []bson.ObjectId `json:"preposttests" bson:"preposttests"` 
    TrainingEvaluations []bson.ObjectId `json:"training_evaluations" bson:"training_evaluations"` 
    TrainerEvaluations []bson.ObjectId `json:"trainer_evaluations" bson:"trainer_evaluations"` 
    AppCompanyId  bson.ObjectId `json:"app_company_id" bson:"app_company_id"` 
    Company    *Company  `json:"company"` 
} 

機能:

func (this *TrainingClass) GetAllTraining() (interface{}, error) { 
    if !this.tokenInfo.IsAllowed(this.c) { 
     return nil, tlib.NewTError(common.Error_NoAccess, "You don't have the right!") 
    } 
    sess, db := GetDB() 
    defer sess.Close() 

    pipeline := []bson.M{ 
     {"$match": bson.M{ 
      "app_company_id": this.tokenInfo.AppCompanyId}}, 
     {"$lookup": bson.M{ 
      "from":   "trainingbatch", 
      "localField": "_id", 
      "foreignField": "training._id", 
      "as":   "trainingbatches"}}, 
    } 

    resp := []bson.M{} 
    db.C(common.C_TRAINING).Pipe(pipeline).All(&resp) 

    return bson.M{"data": resp}, nil 
} 

JSON結果:

{ 
    "data": [ 
    { 
     "_id": "5995a749dbcfbe4e8cc31378", 
     "app_company_id": "58b24756e65bd121f6b1a923", 
     "description": "Description First Training", 
     "name": "First Training", 
     "trainingbatches": [ 
     { 
      "_id": "5995a74adbcfbe4e8cc31379", 
      "app_company_id": "58b24756e65bd121f6b1a923", 
      "company": { 
      "_id": "58b24756e65bd121f6b1a923", 
      "address": "", 
      "app_company_id": "58b24756e65bd121f6b1a923", 
      "fullname": "", 
      "name": "Tandem", 
      "phone": "" 
      }, 
     } 
     ] 
    } 
    ] 
} 

あなたは、フィールドの_idは、代わりにIDを生成している見ることができるように。 findまたはfindIdを使用すると、それは起こりません。クエリが何であってもjsonフィールドを使い続ける方法はありますか?

答えて

1

あなたが結果を読んでいるところでは、JSONフィールド名が何であるか分かりません。これらのタグを使用するには、タグが指定されている構造体に実際にデシリアライズする必要があります。あなたがするとき:

resp := []bson.M{} 
    db.C(common.C_TRAINING).Pipe(pipeline).All(&resp) 

あなたは、明示的にmgoにBSONの結果を返すよう指示しています。あなたが渡すオブジェクト(スライスはbson.M)にはjsonタグがありません。 JSONにシリアライズを制御するために、あなたはAllに指定されたJSONタグで構造体を渡す必要があります。

resp := []Training 
    db.C(common.C_TRAINING).Pipe(pipeline).All(&resp) 
+0

しかし、それはありません、 'lookup'データを削除しますか? すべてのカスタム結合( 'lookup')のためにstructを作成する必要がある場合は、プロセスで少し問題があると思います。あるいは、この種のものに対処するためのベストプラクティスはありますか? –

+0

JSONフィールド名を制御する必要があり、それらがBSONフィールド名と一致しない場合、マッピングを提供する必要があります。これらのマッピングはstructタグでもっとも簡単に提供されます。つまり、結果構造体に一致する構造体に結果を逆直列化する必要があります。あなたは匿名の構造体を使うことができますが、それはあなたをあまり節約しません。コードの量はほぼ同じです。 – Adrian

+0

申し訳ありませんが、あなたの答えはアドリアンに感謝します。 –

関連する問題