当我在内部查询中使用BigDecimal时,我无法从mongoDB获取数据

时间:2017-01-07 06:00:17

标签: java mongodb

     BigDecimal log_max=new BigDecimal(21.11617279052734);
         BigDecimal log_min=new BigDecimal(21.01617279052734);
         BigDecimal lat_max=new BigDecimal(61.43435454343454);
         BigDecimal lat_min=new BigDecimal(61.03435454343454);
         String col_name="latitude";
         String col_name2="longitude";
         List<BasicDBObject> criteria=new ArrayList<BasicDBObject>();
         BasicDBObject searchQuery1 =new BasicDBObject(col_name, new BasicDBObject("$gte", lat_min).append("$lte",  lat_max));
         criteria.add(searchQuery1);
         BasicDBObject searchQuery2=new BasicDBObject(col_name2, new BasicDBObject("$gte", log_min).append("$lte",  log_max));
         criteria.add(searchQuery2); 

         DBCursor cursor = coll.find(query); 
         while (cursor.hasNext()) { 
                DBObject cursorObj = cursor.next();                 
              LOGGER.info("Collection  successf");  
                Object temp1 = cursorObj.get("longitude");
                BigDecimal longitude = new BigDecimal(temp1.toString());
                System.out.println("longitude ::::"+longitude);
                Object temp2 =cursorObj.get("latitude");
                BigDecimal latitude = new BigDecimal(temp2.toString());
                 LOGGER.info("done getting ");

          }
}

我收到java.lang.IllegalArgumentException:无法序列化类java.math.BigDecimal

有没有人知道BigDecimal会变成什么样的......

1 个答案:

答案 0 :(得分:2)

通过浏览互联网上提供的一些资料,我将尝试为您提供简明的答案。

首先,MongoDB本身不支持BigDecimal,因此您无法直接使用BigDecimal。那怎么处理呢?

嗯,有其他选择。

  1. BigDecimal值转换为String并存储在数据库中。如果您使用spring-data,那么它将被处理。但是存储为String并不能按预期工作,而可能会在聚合查询中给出意外结果。
  2. 如果您认为使用Double就足够了,那么您可以使用Double,或者如果您想使用BigDecimal,那么您可以在spring-data-mongodb中编写自定义转换器,当您在数据库中存储时会将BigDecimal转换为Double,并在从Double转换为BigDecimal时将其转换为connection.schema.createTableIfNotExists('notification', (table) => { // UUID table.uuid('id').primary().defaultTo(connection.raw('uuid_generate_v4()')) // Adds a "created_at" and "updated_at" columns on the database, // setting these each to "dateTime" types. table.timestamps() table.string('type', 255) table.string('summary', 255) table.string('text', 255) table.string('actionText', 255) table.string('actionUrl', 255) table.uuid('recipient').references('user.id') }), 。您可以查看this答案以获取示例。
  3. 您可以编写自定义类型并使用它。您可以查看thisthis