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フィールドを使い続ける方法はありますか?
しかし、それはありません、 'lookup'データを削除しますか? すべてのカスタム結合( 'lookup')のためにstructを作成する必要がある場合は、プロセスで少し問題があると思います。あるいは、この種のものに対処するためのベストプラクティスはありますか? –
JSONフィールド名を制御する必要があり、それらがBSONフィールド名と一致しない場合、マッピングを提供する必要があります。これらのマッピングはstructタグでもっとも簡単に提供されます。つまり、結果構造体に一致する構造体に結果を逆直列化する必要があります。あなたは匿名の構造体を使うことができますが、それはあなたをあまり節約しません。コードの量はほぼ同じです。 – Adrian
申し訳ありませんが、あなたの答えはアドリアンに感謝します。 –