当前位置: 首页 > 知识库问答 >
问题:

在同一个Mongodb查询中查找最小值和最大值的最佳方法是什么

尹英华
2023-03-14

很抱歉打扰你,但我无法找到一个有效的解决我的问题的方法。我想做一个MongoDB查询,让我得到与SQL查询相同的结果:从BUSINESS\u STATE\u TERRITORY='Arizona'所在的表中选择MIN(ZIP)作为MIN,MAX(ZIP)作为MAX。首先,我使用MongoDB java驱动程序3.6version从java查询数据库。我从如何在mongodb中找到最小值开始尝试了这个解决方案

db.sales.aggregate(
[
  {
    $group:
    {
      _id: "$item",
      minQuantity: { $min: "$quantity" }
    }
  }
]
)

在java中:

Document min = new Document("$min","$ZIP");
Document max = new Document("$max","$ZIP");
Document group = new Document("$group", new Document("_id","$Business_State_Territory").append("minimum",min).append("maximum",max));
Document match = new Document("$match", new Document("Business_State_Territory","Arizona"));
AggregateIterable output = coll.aggregate(Arrays.asList(match,group));
MongoCursor<Document> cur = output.iterator();
    while(cur.hasNext()){
        Document next = cur.next();
        System.out.println(next.toString());
    }

结果是:

Document{{_id=Arizona, minimum=1608, maximum=null}}

但它没有计算最大值,即99701。

集合中的所有文档都遵循以下结构:

_id:5ad0aea8471aa1aa7f425885
NPI:1003000142
CCN:""
Provider_Type:"EP"
Business_State_Territory:"Ohio"
ZIP:43623
Specialty:"Pain Medicine"
Hospital_Type:""
Program_Type:"Medicare"
Program_Year:2016
Provider_Stage_Number:"Stage 2"
Payment_Year:3
Attestation_Month:2
Attestation_Year:2017
MU_Definition_2014:""
Stage_2_Scheduled_2014:0
EHR_Certification_Number:"1314E01QPVPIEAN"
EHR_Product_CHP_Id:"CHP-027887"
Vendor_Name:"Epic Systems Corporation"
EHR_Product_Name:"EpicCare Ambulatory 2014 Certified EHR Suite"
EHR_Product_Version:"Epic 2015"
Product_Classification:"Complete EHR"
Product_Setting:"Ambulatory"
Product_Certification_Edition_Yr:2014

我希望你能帮我。开始编辑:我尝试使用$project而不是只有max子句的$group。现在结果文档的结构如下:

Document{{_id=5ad0aea8471aa1aa7f425955, Business_State_Territory=Arizona, maximum=85255}}

正如您现在看到的,最大值不是空的,但这些值并不代表最大值。奇怪的是,有些文件是:

Document{{_id=5ad0aea9471aa1aa7f426881, Business_State_Territory=Arizona, maximum=}}

mongodb会将这个空值解释为最大值吗?从医生那里。mongodb。com它说:如果$max操作的某些文档(但不是全部)的字段值为null或缺少字段,则$max操作符只考虑字段的非null和非缺少值。因此,答案必须是否,查询结果不采用空值。这是虫子吗?


共有1个答案

金骞尧
2023-03-14

您使用聚合以正确的方式进行操作。您不需要执行mapReduce。不过,您需要进行更正:

当您使用$group运算符时,您需要引用任何带有前导$的文档字段,如示例中所示:

{ $group: {_id: "$item", minQuantity: { $min: "$quantity" } }

在您的示例中,尝试将前导$添加到字段名称Business_State_Territory,如下所示:

Document group = new Document("$group", new Document("_id","$Business_State_Territory").append("minimum",min).append("maximum",max));
 类似资料:
  • 我在MongoDB有一些收藏,例如下面的一个 我想找到“\u id”或任何其他字段的最小值和最大值。我正在使用“MongoDB指南针”。如何在MongoDB Compass中编写查询,以获得特定列的最小值和最大值

  • 我试图找到矩阵中每列的最小值和最大值,但我当前的代码运行不正确。我试图把最小值放在一个新矩阵的第一行,最大值放在下一行,并对每一列这样做。任何帮助都将不胜感激,谢谢!

  • 问题内容: 我知道标题听起来描述性不强,但这是我能想到的最好的: 我有这张桌子 实际上,这是封装在视图中的非常复杂的查询,但现在已不再重要。 我想为每个ID包含最高BDate的行。在此示例中,这将是结果。 我已经尝试过 但随后它返回所有行,因为对于每个值,列均不同。该查询是在Oracle v10中设计的,我有资格仅使用选择查询而不创建过程。 问题答案: 我们可以在IN子句中使用乘法列:

  • 我有下面的代码,其中计算最小和最大订单项目从列表并按预期工作。我想知道是否可以进一步重构/改进,使其更优化和高性能地处理数千或订单列表。 我故意不做 Collections.min(itemFrequencyMap.values()) 和 因为它需要对所有值进行两次迭代,然后再次循环遍历 以查找值和的条目。