繁体   English   中英

pymongo中最大值对应的嵌入文档

[英]Embedded document corrresponding to the maximum value in pymongo

我的集合中的文档具有以下架构。 每个文件对应一个名称列出的所有提交。

- "_id": ObjectId
- "name": str
- "is_team": bool
- "submissions": List
   - time: datetime
   - score: float

例子:

{"name": "Intrinsic Nubs",
  "is_team": true,
  "submissions": [
    {
      "score": 61.77466359705439,
      "time": {
        "$date": {
          "$numberLong": "1656009267652"
        }
      }
    },
      {
      "score": 81.77466359705439,
      "time": {
        "$date": {
          "$numberLong": "1656009267680"
        }
      }
    }]}

我需要收集所有那些is_teamTrue的文档,并进一步获取与最大分数对应的名称、最大分数和时间。

例子:

[{"name": "Intrinsic Nubs", "MaxScore": 81.77466359705439, "time":{ "$date": {"$numberLong": "1656009267680"}}}]

询问

  • 使用is_team=true保存文档
  • 减少以找到得分最高的成员,并将其返回
  • 你可以$project ,而且我保留了所有看到的变化

玩蒙哥

aggregate(
[{"$match": {"is_team": {"$eq": true}}},
 {"$set": 
   {"name": "$name",
    "max-submision": 
     {"$reduce": 
       {"input": "$submissions",
        "initialValue": {"score": 0},
        "in": 
         {"$cond": 
           [{"$gt": ["$$this.score", "$$value.score"]}, "$$this",
            "$$value"]}}}}}])

这是产生所需输出的另一种方法。

db.collection.aggregate([
  { // limit docs
    "$match": {"is_team": true}
  },
  { // set MaxScore
    "$set": {"MaxScore": {"$max": "$submissions.score"}}
  },
  { "$project": {
      "_id": 0,
      "name": 1,
      "MaxScore": 1,
      "time": {
        // get time at MaxScore
        "$arrayElemAt": [
          "$submissions.time",
          {"$indexOfArray": ["$submissions.score", "$MaxScore"]}
        ]
      }
    }
  }
])

mongoplayground.net上试试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM