gpt4 book ai didi

java - 如何通过java驱动程序在mongodb中存储38位整数

转载 作者:行者123 更新时间:2023-11-30 03:08:20 25 4
gpt4 key购买 nike

我正在从 oracle 迁移到 mongo db,作为此迁移的一部分,我需要保护数据类型(不想在 mongo 中将数字存储为字符串以实现适当的索引/聚合性能)。数字列之一在oracle db中,精度为38(可以有38位数字),小数位数为0(整数)。我正在使用java将其持久化到mongo中,但是使用Long.parseLong("")解析数字字符串将不允许超过19位长的Long.MAX_VALUE,并且mongo db驱动程序本身不支持BigInteger。那么如何在 mongo 中存储 38 位长数字,同时保持数据类型并使用 java 驱动程序?

import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

public class Main {
public static void main(String[] args) {
MongoClient mongoClient = new MongoClient();
MongoDatabase db = mongoClient.getDatabase("test");
MongoCollection<Document> migration = db.getCollection("migration");
Document document = new Document("name","MAX_VALUE").append("number",Long.MAX_VALUE);
migration.insertOne(document);
}
}

结果

{
"_id" : ObjectId("5669c0dfd64eab11860d8e83"),
"name" : "MAX_VALUE",
"number" : NumberLong(9223372036854775807)
}

但如果我这样做

Document document = new Document("name","20_DIGIT").append("number",Long.parseLong("12345678901234567890")); 

这会导致

Exception in thread "main" java.lang.NumberFormatException: For input string: "12345678901234567890"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:592)
at java.lang.Long.parseLong(Long.java:631)
at Main.main(Main.java:13)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

因为它超出了远距离

Document document = new Document("name","BIG_INTEGER").append("number",new BigInteger("12345678901234567890"));

将导致

Exception in thread "main" org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class java.math.BigInteger.

附:我不打算使用实体映射/orm。

最佳答案

我认为不可能在 mongo 的单个字段中保存 38 位整数。看看Mongo的supported types我们看到他们支持的最大整数是 64 位长整型。 64 位数字的最大值为 9223372036854775807,小于 38 位。

关于java - 如何通过java驱动程序在mongodb中存储38位整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34209220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com