使用 Spring Data MongoDB 在 MongoDB 中对存储为 BigDecimal 类型的数值进行排序

2024-02-06

我正在通过教程学习 Spring Data MongoDB (https://spring.io/guides/tutorials/data/2/ https://spring.io/guides/tutorials/data/2/)。 在本教程中,成本类型为 BigDecimal,如下所示,并以“字符串”形式存储在 MongoDB 中。 因此,当我尝试按成本字段进行升序排序时,我得到了错误的结果。

我发现使用 BigDecimal 类是计算的最佳方法。 但是,如果我使用 MongoDB 中的 Spring Data MongoDB 将数字保存为 BigDecimal 类型, 它将被保存为字符串类型 我会得到一个错误的排序结果,就像本教程一样。

为了精确起见,我该怎么做才能获得正确的数字排序结果? 你能帮我解决这个问题吗? 预先非常感谢您。

例如,

1> 菜单项类

@Document(collection = "menu")
public class MenuItem {
  @Id
  private String id;

  @Field("itemName")
  @Indexed
  private String name;
  private BigDecimal cost;

2> 创建MenuItem的实例

MenuItem item = new MenuItem();
item.setDescription("Peanutty Noodles, perfect for every occasion.");
item.setName("Yummy Noodles");
item.setCost(new BigDecimal("52.99"));


MenuItem item = new MenuItem();
item.setDescription("Rice, Egg Fried");
item.setName("Yummy Rice");
item.setCost(new BigDecimal("211.99")); 

3>排序结果

db.menu.find().sort({cost:1})

{ "_id" : ObjectId("53e982f0300475a4fbab8c32"), "_class" : "com.yummynoodlebar.persistence.domain.MenuItem", "itemName" : "美味米饭", "description" : "米饭,鸡蛋炒", "配料" : [ { "name" : "鸡蛋", "description" : "鸡蛋" }, { "name" : "米饭", "description" : "白米饭" } ], "cost" : "211.99" , "准备时间": 0 }

{ "_id" : ObjectId("53e982f0300475a4fbab8c33"), "_class" : "com.yummynoodlebar.persistence.domain.MenuItem", "itemName" : "美味米饭", "description" : "米饭,鸡蛋炒", "配料" : [ { "name" : "鸡蛋", "description" : "鸡蛋" }, { "name" : "米饭", "description" : "白米饭" } ], "cost" : "211.99" , "准备时间": 0 }

{ "_id" : ObjectId("53e982f0300475a4fbab8c2f"), "_class" : "com.yummynoodlebar.persistence.domain.MenuItem", "itemName" : "美味面条", "description" : "花生面条,适合各种场合。 ", "配料" : [ { "名称" : "花生", "描述" : "一颗坚果" }, { "名称" : "鸡蛋", "描述" : "用于面条" }, { "名称" : "面条", "描述" : "酥脆可爱的面条" } ], "成本" : "52.99", "分钟准备" : 0 }

{ "_id" : ObjectId("53e982f0300475a4fbab8c30"), "_class" : "com.yummynoodlebar.persistence.domain.MenuItem", "itemName" : "美味面条", "description" : "花生面条,适合各种场合。 ", "配料" : [ { "名称" : "花生", "描述" : "一颗坚果" }, { "名称" : "鸡蛋", "描述" : "用于面条" }, { "名称" : "面条", "描述" : "酥脆可爱的面条" } ], "成本" : "52.99", "分钟准备" : 0 }

{ "_id" : ObjectId("53e982f0300475a4fbab8c31"), "_class" : "com.yummynoodlebar.persistence.domain.MenuItem", "itemName" : "美味面条", "description" : "花生面条,适合各种场合。 ", "配料" : [ { "名称" : "鸡蛋", "描述" : "用于面条" }, { "名称" : "花生", "描述" : "坚果" }, { "名称" : "面条", "描述" : "酥脆可爱的面条" } ], "成本" : "52.99", "分钟准备" : 0 }


自版本以来3.4,MongoDB 通过新的十进制数据类型(decimal128)添加了对“BigDecimal”的支持。然而,Spring Data仍然映射JavaBigDecimal到 MongoDBstring默认情况下(我想这是为了向后兼容)。好消息是可以通过注入一个简单的方法来覆盖默认映射CustomConversions在spring boot应用中如下:

@Bean
CustomConversions customConverions() {
  Converter<Decimal128, BigDecimal> decimal128ToBigDecimal = new Converter<Decimal128, BigDecimal>() {
    @Override
    public BigDecimal convert(Decimal128 s) {
      return s==null ? null : s.bigDecimalValue();
    }
  };

  Converter<BigDecimal, Decimal128> bigDecimalToDecimal128 = new Converter<BigDecimal, Decimal128>() {
    @Override
    public Decimal128 convert(BigDecimal s) {
      return s==null ? null : new Decimal128(s);
    }
  };

  return new CustomConversions(Arrays.asList(decimal128ToBigDecimal, bigDecimalToDecimal128));
}

请检查这篇文章提供了更详细的信息,甚至是一个完整的例子 http://www.mytechtip.com/2018/01/sort-bigdecimal-mongodb-spring-data.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Spring Data MongoDB 在 MongoDB 中对存储为 BigDecimal 类型的数值进行排序 的相关文章

随机推荐

  • 单元测试 Maven 插件

    我正在寻找有关如何为 Maven 插件编写单元测试的信息 虽然有a page http maven apache org plugin developers plugin testing html在关于这一主题的 Maven 站点上 只有一
  • 不可哈希类型:“dict”类型错误[重复]

    这个问题在这里已经有答案了 假设我有这本字典 items 1 title u testing123 description u testing456 2 description u testing123 description u test
  • IPython 中的物理括号符号

    我正在努力拥有ket符号通常在乳胶中写为 ket psi 然而 当写在 当使用以下方式编写时 这也不起作用IPython display latex documentclass article usepackage amsmath begi
  • AngularJS - 将多个 get 请求收集到 json 数组中,然后传递给指令

    我是角度新手 一直在努力解决我的问题 我需要多次访问 API 来获取用户数据 将所有内容存储为 JSON 数组 当收集所有数据 所有结果作为一个数组 时 需要将其传递给指令 该指令将使用它来绘制可视化 例如 d3 js 饼形图 scope
  • ctx.Err() 与 ctx.Done() chan 关闭检查:有区别吗?

    我处于一个长时间运行的可取消函数中 该函数具有永远循环 我需要检查上下文是否已关闭 go func for if ctx Err nil return do work vs go func for select case lt ctx Do
  • Xcode 组织者尝试在错误的目录路径访问传输程序

    Transporter not found at path usr local itms bin iTMSTransporter You should reinstall the application 所以我检查了路径 Applicati
  • java 具有透明度的全屏窗口

    我正在尝试使用 Java 创建一个覆盖整个屏幕的全屏窗口 这个窗口还必须有一定的透明度 大约30 50 透明 当我说整个屏幕时 我的意思是它覆盖了所有内容 包括 OSX Linux Windows 中的扩展坞 任务栏 菜单栏 当我说透明度时
  • Autofac - 将属性注入 asp.net mvc 控制器

    我有一个基本控制器 它继承了我的所有控制器 这个基本控制器有一些属性 我想使用属性注入来注入 我的控制器注册看起来像这样 builder RegisterControllers Assembly GetExecutingAssembly 我
  • 在 ListView 布局模板中显示总计

    我使用 ListView 控件 ASP NET 2008 来显示一堆数据行 在底部我想要一些总计 我最初打算在 LayoutTemplate 中定义页眉和页脚 并使用一些本地函数 即 获取总计 但 LayoutTemplate 似乎不处理
  • 如何使用 java Firebase Admin SDK 将分析标签添加到数据消息?

    自 7 月 1 日起 Firebase 要求向消息添加标签 以便分析显示数据消息发送的数量等 从 2019 年 7 月 1 日星期一开始 您将能够通过分析标签过滤数据 在该日期之后 没有分析标签发送的数据消息可能不会在此仪表板中显示 问题是
  • 连续检查队列

    我想要一个函数来在一个线程上连续检查队列是否有新添加 显然 可以选择连续循环睡眠 但我想要一些不那么浪费的东西 我考虑了某种类型的等待句柄 然后让队列向它发出信号 但我无法安全地覆盖 Enqueue 因为它不是虚拟的 现在我正在考虑封装一个
  • 奇怪的重复出现的模板和模板参数相关的子类化问题

    我正在尝试使以下代码工作 template lt class derived class object typename derived Object gt struct Base using Derived derived using O
  • Scala:通过依赖注入协调类型类

    最近 Scala 博主们似乎对类型类模式 其中一个简单的类具有由符合某些特征或模式的附加类添加的功能 作为一个过于简单化的例子 简单的类 case class Wotsit value Int 可以适应 Foo 特征 trait Foo T
  • Next.js 应用程序错误:发生客户端异常(有关更多信息,请参阅浏览器控制台)

    尝试加载呈现从外部 API 提取的产品信息的页面时看到上述错误 错误仅发生在生产环境中 本地一切运行正常 检查控制台时出现此错误 TypeError undefined is not a function near n map Next B
  • Rails 3 Web 字体 (woff) mime 类型

    我们从静态资产中提供一些网络字体 woff 我想设置正确的 mime 类型 application x font woff 我尝试这样做config initializers mime types rb但它没有效果 Mime Type re
  • 是否可以使用 itextSharp 将 PDF 页面转换为图像?

    您好 我一直在 dot net 中的所有 pdf 相关项目中使用 itextSharp 我遇到了一个需要将 PDF 页面转换为图像的需求 我找不到任何此类事情的样本 我发现另一个工具 Ghostscript 能够做到这一点 问题是我在共享主
  • 如何让WebStorm IDE正确识别文件类型?

    的背景 在 JetsBrains WebStorm IDE 中 最初我创建了一个名为HelloWorldContainer 不小心遗漏了 js扩展 我的意思是创建HelloWorldContainer js WebStorm 询问我希望该文
  • 闪亮的数据表:禁用某些行的行选择

    我正在尝试确定是否有可能shiny DataTable对某些行禁用行选择 使用selection的参数DT datatable我可以预先选择行 确定用户是否选择行或列或两者 并完全禁用选择 但我不清楚是否可以指示要排除的特定行 这可能吗 R
  • Google 地图 API 3refererNotAllowedMapError

    我对 Google Maps APi 并不陌生 并且已经使用它很多年了 但我很困惑 我已经安装了 Google Maps Javascript API 的最新代码示例的精确副本 简单地图 然后 我从 Google Developers Co
  • 使用 Spring Data MongoDB 在 MongoDB 中对存储为 BigDecimal 类型的数值进行排序

    我正在通过教程学习 Spring Data MongoDB https spring io guides tutorials data 2 https spring io guides tutorials data 2 在本教程中 成本类型