在mongodb的单个查询中获取最小值和最大值

Posted

技术标签:

【中文标题】在mongodb的单个查询中获取最小值和最大值【英文标题】:Get min and max value in single query in mongodb 【发布时间】:2018-11-26 18:05:30 【问题描述】:

考虑“单词”中的以下文档:

[
  _id: 1,
  usages: 2,
  word: "Name"
, 
  _id: 2,
  usages: 1,
  word: "Street"
, 
  _id: 3,
  usages: 1,
  word: "House"
, 
  _id: 4,
  usages: 3,
  word: "Table"
, 
  _id: 5,
  usages: 3,
  word: "Bread"
, 
  _id: 6,
  usages: 4,
  word: "Door"
]

如何获取使用次数最低或最高的所有记录?最低应返回 id 2 和 3(及其单词),最高应返回 id 6 及其单词。

我需要将这些数据聚合成随机数量的最低/最高记录(准确地说是 50 个),因此它需要是一个聚合。

它应该是单次查找,因此使用 $max 或 $min 的另一个查询无法找到最小值/最大值。

MongoDB 版本是 3.4.7,Mongoose 版本是 5.0.0-rc1。不需要 Mongoose 解决方案,因为我可以使用原始查询。 (但它是首选!)

例子:

Words.aggregate([ 
   
    $match:  _
      usages:  WHAT_SHOULD_I_HAVE_HERE 
    
  ,  
    $sample:  
      size: 50 
     
  
])

谢谢!

【问题讨论】:

【参考方案1】:

你可以试试下面的聚合

$facet 将为您提供usages 的两个最低和最高值,您可以使用$filter 运算符轻松地通过它们$project

db.collection.aggregate([
   "$facet": 
    "minUsages": [ "$sort":  "usages": -1  ],
    "maxUsages": [ "$sort":  "usages": 1  ]
  ,
   "$addFields": 
    "lowestUsages": 
      "$arrayElemAt": ["$minUsages", 0]
    ,
    "highestUsages": 
      "$arrayElemAt": ["$maxUsages", 0]
    
  ,
   "$project": 
    "minUsages": 
      "$filter": 
        "input": "$minUsages",
        "as": "minUsage",
        "cond": 
          "$eq": ["$$minUsage.usages", "$lowestUsages.usages"]
        
      
    ,
    "maxUsages": 
      "$filter": 
        "input": "$maxUsages",
        "as": "maxUsage",
        "cond": 
          "$eq": ["$$maxUsage.usages", "$highestUsages.usages"]
        
      
    
  
])

或者您也可以使用find 查询来完成此操作

const minUsage = await db.collection.find().sort( "usages": -1 ).limit(1)
const maxUsage = await db.collection.find().sort( "usages": 1 ).limit(1)

const minUsages = await db.collection.find( "usages":  "$in": [minUsages[0].usages]  )
const maxUsages = await db.collection.find( "usages":  "$in": [maxUsages[0].usages]  )

看看here

【讨论】:

您的聚合工作完美!尽管您仍然添加了具有 2 个或 4 个查询的方法。你认为 find 方法比聚合方法更快吗?

以上是关于在mongodb的单个查询中获取最小值和最大值的主要内容,如果未能解决你的问题,请参考以下文章

用于从 Hive 中获取单个表的最大值、最小值和其他列的相应值以及总记录数的数据库查询

如何在 1 个查询中从 Mongo DB 获取最小值和最大值? C#

Pyspark - 从具有最小值和最大值范围的数组中获取值

db2 sql,如何仅在一张表的同一查询中获取最小值和最大值?

使用过滤器获取分区数据的最小值和最大值

获取Laravel中每个不同项目名称的最小值和最大值的集合项