在 MongoDB 中查找最高值

Posted

技术标签:

【中文标题】在 MongoDB 中查找最高值【英文标题】:Find the highest value in MongoDB 【发布时间】:2022-01-18 22:43:08 【问题描述】:

我有收藏 - 歌曲

我需要找到最长的歌曲,但歌曲的长度有两种格式:秒和 HH:MM:SS。


  "_id": "61179c8d43400f31df195223",
  "name": "song1",
   "time": 2000
,

  "_id": "61179c8341f00f31df159223",
  "name": "song2",
  "time": "00:34:16"
,

  "_id": "61179c8341f00f31df195223",
  "name": "song3",
  "time": 2800
,

  "_id": "61179c8380f00f31df195223",
  "name": "song4",
  "time": "00:01:10"

,
  "_id": "61179c8310f00f31df195223",
  "name": "song5",
  "time": "00:15:10"

【问题讨论】:

【参考方案1】:

查询

添加一个新字段 timeSec,以秒为单位存储时间 如果时间不是字符串,我们会保留时间(已经是秒) 其他 将字符串拆分为多个部分,例如[1, 2, 10] $zip 部分及其乘数 [[1 3600] [2 60] [10 1]] (1 小时 = 3600 秒等) 在我们多个数组成员之后归约到总和

*如果它嵌套了很多,你可以使用更多的 tempFields 来取消它的嵌套以提高可读性。

Test code here

aggregate(
[$set:
  timeSec:
   $cond: 
    [$eq:[$type:"$time", "string"],
     $reduce:
      input:
       $zip:inputs:[$split:["$time", ":"], [3600, 60, 1]],
       initialValue:0,
       in:
       $add:
        ["$$value",
         $multiply:
          [$toInt:$arrayElemAt:["$$this", 0],
           $arrayElemAt:["$$this", 1]]],
     "$time"],
 $sort:timeSec:-1,
 $limit:1])

【讨论】:

【参考方案2】:

没有直接的方法可以做到这一点,您可以尝试聚合管道,

$addFields 添加或编辑字段 $cond 检查是 time 字段编号,使用 $isNumber 如果是,则返回当前 time 否则转到其他部分 $let 在使用 $split 拆分后创建内存变量 time 通过“:” $arrayElemAt 获取拆分数组上方的特定元素形式 $toInt 将拆分数字转换为整数 $multiply 将小时、分钟乘以特定数字,以秒为单位进行转换 $sum 获取总秒数 $sort time 按降序排列 $limit 获取第一个文件
db.collection.aggregate([
  
    $addFields: 
      time: 
        $cond: [
           $isNumber: "$time" ,
          "$time",
          
            $let: 
              vars: 
                time:  $split: ["$time", ":"] 
              ,
              in: 
                $sum: [
                  
                    $multiply: [
                       $toInt:  $arrayElemAt: ["$$time", 0]  ,
                      3600
                    ]
                  ,
                  
                    $multiply: [
                       $toInt:  $arrayElemAt: ["$$time", 1]  ,
                      60
                    ]
                  ,
                   $toInt:  $arrayElemAt: ["$$time", 2]  
                ]
              
            
          
        ]
      
    
  ,
   $sort:  time: -1  ,
   $limit: 1 
])

Playground

【讨论】:

以上是关于在 MongoDB 中查找最高值的主要内容,如果未能解决你的问题,请参考以下文章

mongodb中DBRefs只能向上查找一级吗

$在mongodb中查找多个级别

使用 pymongo 在 mongoDB 中查找

MongoDB - 查找 - 多个集合 - 结果在一个数组中

mongodb查找所有最多

MongoDB中基于条件的查找