在MongoDB中,integer数据类型是否自动类型转换为doube



在MongoDB中,我有一个值为的集合(我在mongoShell中复制了它(:

{
"_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获取时,integer被转换为double吗。

有人能解释一下为什么整数被转换为双精度吗当我尝试用java获取时。

movie集合中的文档:

{ "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"));

打印,> Star Wars : 1977.0

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

如果您(提前(知道数据库有一个值,并且您希望它在应用程序中为整数,您可以简单地将该特定字段强制转换为整数,如下所示:

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

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

在外壳中插入以下文件:

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

并且,从相同的Java代码中检索(没有强制转换为整数(,该代码将打印> Return of Jedi : 1983



将文档映射到Java类

如何使Java应用程序将特定字段类型视为整数(如示例中的year字段(,并将集合的文档用作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

插入使用MoviePOJO:的文档

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

相关内容

  • 没有找到相关文章