我有Mongo(GO)的Collection ,类型是:

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"`
}

我需要判断最近5个记录的评级中值(由receivedAt个时间段)为某些用户(由他的user_id). 我已经得到了这个:

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开始的一个选项是使用$median累加器升级到$group

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

对于较旧版本,您可以

  1. $sort x 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}}}
    }}}}
  }}}}
}}}}

Mongodb相关问答推荐

在MogoDB中按时间间隔分组、统计文档和获取间隔时间

如何在Mongo中制作全覆盖索引

如何获取键值对的对象,其中值仅具有 mongoDB 中的投影字段

MongoDB 聚合 - $project 和 $match 阶段未按预期工作

Mongodb,在一个查询中用正则表达式更新部分字符串

使用 mongo-driver/mongo 使用键/值对中的值表达式查找文档

如何在 MongoDB 中已经存在的 slug 中添加一个随机数?

根据聚合管道MongoDB Atlas触发器中的条件更新多个字段

根据状态过滤 mongoDb 中的结果

$eq 的目的是什么

Mongo查找对象内最长数组的查询

MongoDB:设置 Windows 服务

python mongodb正则表达式:忽略大小写

Mongo DB中的Upserting和Id问题

是否有适用于 Linux 的 MongoDB GUI 桌面应用程序?

如何使用 MongoDB Compass 对数据进行排序

遍历所有 Mongo 数据库

为什么我新创建的 mongodb 本地数据库增长到 24GB?

mongodb 的计数性能

用 MongoDB 中的属性表示多对多关系的最佳模型