mongo java driver日期转换问题

本文讨论了MongoDB中日期存储为64位整数的问题,以及使用Java驱动时日期自动转换为GMT时间导致时区差异。通过提供自定义日期转换方法,解决了跨时区查询不匹配的问题。
https://github.com/ewcmsfree/ewcms/wiki/Help-mongo-java-driver-date
mongo java driver日期转换问题
mongo保存日期是一个64-bit整形数。java driver保存Date时会把他自动转换为标准时间GMT。如中国在GMT+8时区,保存2012-01-20 00:00:00到库中,查询后结果竟然是2012-01-19 16:00:00跟想要结果不一致。 可以在com.mongodb.util.JSON找到问题根源:

 if (o instanceof Date) {
            Date d = (Date) o;
            SimpleDateFormat format = 
        new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
            format.setCalendar(new GregorianCalendar(new SimpleTimeZone(0, "GMT")));
        serialize(new BasicDBObject("$date", format.format(d)), buf);
            return;
  }
找到问就好办,自己完成日期的转换:

SimpleDateFormat
 SimpleDateFormat format = 
        new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
 format.setCalendar(new GregorianCalendar(new SimpleTimeZone(0, "GMT")));
 Date date = format.parse("2012-01-20 00:00:00");
date日期变成2012-01-20 08:00:00+08也就是在GMT+8时区下自动加8个小时。

 

### 使用 Apache Calcite 和 Mongo-Java-Driver 连接 MongoDB 数据库 Apache Calcite 是一个动态数据管理框架,支持多种数据源的查询处理,包括关系型数据库、NoSQL 数据库以及自定义数据源。MongoDB 作为一种流行的 NoSQL 数据库,可以通过 Calcite 的适配器(Adapter)机制实现 SQL 查询能力。 #### 配置 Calcite 使用 MongoDB Adapter Calcite 提供了专门用于 MongoDB 的适配器 `org.apache.calcite.adapter.mongodb.MongoSchemaFactory`,它允许通过标准的 SQL 语法访问 MongoDB 集合中的数据。 在配置过程中,需要引入必要的依赖项,并设置连接参数。以下是一个典型的 Schema 定义方式: ```json { "name": "mongo", "type": "custom", "factory": "org.apache.calcite.adapter.mongodb.MongoSchemaFactory", "operand": { "host": "localhost", "port": 27017, "database": "test" } } ``` 此配置将创建一个名为 `mongo` 的 schema,指向本地运行的 MongoDB 实例中的 `test` 数据库[^4]。 #### Java 示例:使用 Calcite 连接 MongoDB 下面是一个完整的示例代码,展示如何通过 Calcite 使用 Mongo-Java-Driver 连接到 MongoDB 并执行 SQL 查询: ```java import org.apache.calcite.jdbc.CalciteConnection; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class CalciteMongoExample { public static void main(String[] args) throws Exception { // 加载 Calcite JDBC 驱动 Class.forName("org.apache.calcite.jdbc.Driver"); // 建立连接,这里假设有一个配置文件 calcite-model.json Connection connection = DriverManager.getConnection("jdbc:calcite:model=src/main/resources/calcite-model.json"); CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class); Statement statement = calciteConnection.createStatement(); // 执行 SQL 查询 ResultSet resultSet = statement.executeQuery("SELECT * FROM mongo.test.collection_name LIMIT 5"); // 输出结果 while (resultSet.next()) { System.out.println(resultSet.getString(1)); } // 关闭资源 resultSet.close(); statement.close(); connection.close(); } } ``` 其中,`calcite-model.json` 文件内容如下: ```json { "version": "1.0", "defaultSchema": "mongo", "schemas": [ { "name": "mongo", "type": "custom", "factory": "org.apache.calcite.adapter.mongodb.MongoSchemaFactory", "operand": { "host": "localhost", "port": 27017, "database": "test" } } ] } ``` #### 自定义函数与扩展性 如果希望在 SQL 中调用 MongoDB 的聚合操作或用户自定义函数(UDF),可以在 schema 中进行扩展。例如,在 operand 中添加 functions 列表来定义特定逻辑[^2]。 此外,Calcite 的 MongoDB Adapter 会自动将 SQL 转换为对应的 MongoDB 查询语句,开发者无需手动编写 BSON 查询逻辑即可完成复杂的数据检索任务[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值