首頁  >  文章  >  後端開發  >  Golang中的Mongo中位數運算

Golang中的Mongo中位數運算

PHPz
PHPz轉載
2024-02-08 23:33:08886瀏覽

Golang中的Mongo中位數運算

Golang中的Mongo中位數運算是一項重要的技術,對開發人員來說具有很大的意義。它可以讓我們在處理Mongo資料庫時更加靈活和有效率。在Golang中,我們可以使用Mongo中值運算來實現各種資料操作,例如插入、更新和刪除等。這種運算方式可以讓我們更能利用Mongo的強大功能,提升我們的開發效率。本文將透過實​​際案例,介紹Golang中的Mongo中位數運算的使用方法和注意事項,幫助開發人員更能掌握這項技術。

問題內容

我在 mongo (go) 中有一個集合,其型別是:

type CreateFeedbackRequest struct {
    UserID     string    `json:"user_id" validate:"required"`
    WaybillID  uint64    `json:"waybill_id" validate:"required"`
    Rating     int       `json:"rating" validate:"required"`
    Comment    string    `json:"comment"`
    ReceivedAt time.Time `json:"received_at" validate:"required"`
}

我需要評估某個使用者(透過他的 user_id)的最後 5 筆記錄(透過 receivedAt 時間欄位)的評分中位數。 我已經得到了這個:

matchStage := bson.D{{"$match", bson.D{{"_id", userID}}}}
sortStage := bson.D{{"$sort", bson.D{{"created_at", 1}}}}
limitStage := bson.D{{"$limit", tripsCount}}

cursor, err := r.c.Aggregate(ctx, mongo.Pipeline{matchStage, sortStage, limitStage})

但我不知道如何獲得這 5 行的評分中位數。我不確定我這樣做的正確方法。求助,謝謝

解決方法

$limit 階段之後,自mongodb 版本7.0 以來的一個選項是$group $median 累加器

groupgStage := bson.D{{"$group", bson.D{
  {"_id", 0}, 
  {"median", bson.D{{"$median", 
    bson.D{{"$input", "$rating"}, {"method", "approximate"}}
  }}}
}}}

對於舊版本,您可以

  1. $sort 透過 rating
  2. #$group$push 所有 rating 到一個陣列(限制後全部 5 個)
  3. $project 陣列中間的項目

它看起來像這樣:

sortRatingStage := bson.D{{"$sort", bson.D{{"rating", 1}}}}
groupStage := bson.D{{"$group", bson.D{{"_id", 0}, {"ratings", bson.D{{"$push", "ratings"}}}}}}
projectStage := bson.D{{"$project", bson.D{
  {"_id", 0}, 
  {median, bson.D{{"$arrayElemAt", bson.D{
    {"$ratings", bson.D{{"$floor", bson.D{
      {"$divide", bson.A{{bson.D{{"$size", "$ratings"}}, 2}}}
    }}}}
  }}}}
}}}}

以上是Golang中的Mongo中位數運算的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除