package rchgordmod import ( "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" ) type VIPExperimentOrderStat struct { Variant string `json:"variant" bson:"variant"` ProductID primitive.ObjectID `json:"productId" bson:"productId"` CreatedOrders int `json:"createdOrders" bson:"createdOrders"` PaidOrders int `json:"paidOrders" bson:"paidOrders"` RefundedOrders int `json:"refundedOrders" bson:"refundedOrders"` OrderAmount int64 `json:"orderAmount" bson:"orderAmount"` PaidAmount int64 `json:"paidAmount" bson:"paidAmount"` GoldPaidOrders int `json:"goldPaidOrders" bson:"goldPaidOrders"` GoldPaidAmount int64 `json:"goldPaidAmount" bson:"goldPaidAmount"` } func VIPExperimentOrderStatistics(experimentID string) ([]VIPExperimentOrderStat, error) { var raw []struct { ID struct { Variant string `bson:"variant"` ProductID primitive.ObjectID `bson:"productId"` } `bson:"_id"` CreatedOrders int `bson:"createdOrders"` PaidOrders int `bson:"paidOrders"` RefundedOrders int `bson:"refundedOrders"` OrderAmount int64 `bson:"orderAmount"` PaidAmount int64 `bson:"paidAmount"` } err := coll(nil).Aggregate(&raw, []bson.M{ {"$match": bson.M{"experimentId": experimentID}}, {"$group": bson.M{ "_id": bson.M{ "variant": "$experimentVariant", "productId": "$productID", }, "createdOrders": bson.M{"$sum": 1}, "paidOrders": bson.M{"$sum": bson.M{"$cond": bson.A{ bson.M{"$eq": bson.A{"$status", SUCCESS}}, 1, 0, }}}, "refundedOrders": bson.M{"$sum": bson.M{"$cond": bson.A{ bson.M{"$eq": bson.A{"$status", REFUND}}, 1, 0, }}}, "orderAmount": bson.M{"$sum": "$money"}, "paidAmount": bson.M{"$sum": bson.M{"$cond": bson.A{ bson.M{"$eq": bson.A{"$status", SUCCESS}}, "$payMoney", 0, }}}, }}, {"$sort": bson.D{{Key: "_id.variant", Value: 1}, {Key: "createdOrders", Value: -1}}}, }) if err != nil { return nil, err } result := make([]VIPExperimentOrderStat, 0, len(raw)) for _, item := range raw { result = append(result, VIPExperimentOrderStat{ Variant: item.ID.Variant, ProductID: item.ID.ProductID, CreatedOrders: item.CreatedOrders, PaidOrders: item.PaidOrders, RefundedOrders: item.RefundedOrders, OrderAmount: item.OrderAmount, PaidAmount: item.PaidAmount, }) } return result, nil }