首頁 > 後端開發 > Golang > 主體

Golang中的Mongo中位數運算

PHPz
發布: 2024-02-08 23:33:08
轉載
877 人瀏覽過

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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!