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

在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提取整数时将其转换为双精度吗。

lwj1314520 回答:在MongoDB中,整数数据类型是否自动类型转换为doube?

有人可以解释为什么整数被转换为双精度 当我尝试获取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

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

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

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

但是,shell还提供了满足特定需求的其他数据类型。参见Data Types in the 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.
}

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

映射数据库文档和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);
本文链接:https://www.f2er.com/2599057.html

大家都在问