在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获取时,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
这是因为从mongo
shell输入时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
要插入使用Movie
POJO:的文档
Movie document = new Movie();
document.setName("Empire Strikes Back");
document.setYear(1980);
movies.insertOne(document);