gpt4 book ai didi

java - 在 MongoDB 中整数数据类型会自动类型转换为 double 吗?

转载 作者:行者123 更新时间:2023-12-01 17:50:18 24 4
gpt4 key购买 nike

在 MongoDB 中,我有一个具有值的集合(我在 mongo Shell 中复制了它):

{
"_id" : "5e74c0e32e13013cdea246e8",
"year" : 1968
}

但是当我在 Java 代码中获取它时,我得到的是:

{
"_id" : "5e74c0e32e13013cdea246e8",
"year" : 1968.0
}

这是我的代码:

    ConnectionString connectionString = new ConnectionString(URI);
MongoClientSettings settings = MongoClientSettings.builder()
.applyConnectionString(connectionString)
.applicationName("mflix")
.build();
MongoClient connection = MongoClients.create(settings);
MongoDatabase database = connection.getDatabase("test");
MongoCollection<Document> movieDetails = database.getCollection("student");
try(MongoCursor<Document> its = movieDetails.find().limit(1).iterator())
{
while(its.hasNext())
{
System.out.println(its.next());
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
connection.close();

有人可以解释一下为什么当我尝试在 java 中获取时整数被转换为 double 吗?

最佳答案

Can someone please explain why integer is getting converted to double while I am trying to fetch in java.

电影集合中的文档:

{ "name" : "Star Wars", "year" : 1977 }

让我们考虑一下这段 Java 代码

MongoCollection<Document> movies = db.getCollection("movie");
Document d1 = movies.find(new Document()).iterator().tryNext();
System.out.println("> " + d1.get("name") + " : " + d1.get("year"));

打印,>星球大战:1977.0

这是因为从 mongo shell 输入时 year 字段的数据类型。默认情况下,数字数据是浮点double值。

如果您(提前)知道数据库有一个 double 值,并且希望在应用程序中将其作为 整数,则只需将该特定字段转换为整数如下:

System.out.println("> " + ((Double) d1.get("year")).intValue()); // prints > 1977

但是,shell 还提供了其他数据类型来满足特定需求;请参阅Data Types in the mongo Shell 。下面显示了一个整数可以存储在数据库中并从 Java 应用程序中检索。

在 shell 中插入以下文档:

{ name: "Return of Jedi", year: new NumberInt(1983) }

并且,从相同的 Java 代码中检索(不转换为整数),打印 > Return of Jedi : 1983


<小时/> 将文档映射到 Java 类

如何使 Java 应用程序将特定字段类型视为整数(如示例中的“年份”字段)并将集合的文档用作 Java 对象?假设您有电影集合,并且它可以在您的应用程序中表示为 Java POJO; Movie.java:

public class Movie {
private ObjectId id;
private String name;
private int year;

public Movie() {
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}

// other get/set methods, etc.
}

请注意,在上述 Movie 类中,year 字段被声明为 int(并假设数据库字段存储为默认浮点型)数)。

映射数据库文档和 Java POJO ( Plain Old Java Objects ) 类的代码是使用“编解码器”。数据被转换为 Java 对象,无需任何修改即可在应用程序中使用。

编解码器指定如何转换文档 BSON 数据。有默认和自定义编解码器。在下面的代码中,我们使用默认编解码器将数据库映射到 Java 数据(在本例中它可以工作)。对于复杂的需求,您可以构建自定义编解码器。

CodecRegistry pojoCodecRegistry =
fromRegistries(
MongoClientSettings.getDefaultCodecRegistry(),
fromProviders(PojoCodecProvider.builder().automatic(true).build()));

MongoCollection<Movie> movies = db.getCollection("movie", Movie.class
.withCodecRegistry(pojoCodecRegistry);
Movie m1 = movies.find(new Document()).iterator().tryNext();
System.out.println("> " + m1.getName() + " : " + m1.getYear()); // > Star Wars : 1977

要使用Movie POJO插入文档:

Movie document = new Movie();
document.setName("Empire Strikes Back");
document.setYear(1980);
movies.insertOne(document);

关于java - 在 MongoDB 中整数数据类型会自动类型转换为 double 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60809700/

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