В MongoDB целочисленный тип данных автоматически приводится к типу doube? - PullRequest
0 голосов
/ 23 марта 2020

В 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.

1 Ответ

0 голосов
/ 23 марта 2020

Может кто-нибудь объяснить, почему целое число преобразуется в удвоенное, а я пытаюсь получить в 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"));

Prints, > Star Wars : 1977.0

Это связано с типом данных поля year при вводе из mongo ракушка. По умолчанию числовые данные имеют значение с плавающей точкой double .

Если вы знаете (впереди), что в базе данных есть значение double , и вы хотите, чтобы оно было целое число в вашем приложении, вы можете просто преобразовать указанное поле c в целое число следующим образом:

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

Но оболочка также предоставляет другие типы данных для указания c потребности; см. Типы данных в пн go Оболочка . Ниже показано, что целое число может быть сохранено в базе данных и получено из вашего приложения Java.

В оболочке вставьте следующий документ:

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

И получите из тот же код Java (без приведения к целому числу), который печатает, > Return of Jedi : 1983



Отображение документа в Java Класс

Как заставить ваше приложение Java видеть указанный тип поля c в виде целого числа (как в примере, поле year) и использовать документ коллекции в качестве объекта Java? Предположим, у вас есть коллекция mov ie, и она может быть представлена ​​в вашем приложении как 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, который можно использовать в приложении без каких-либо изменений.

A код c определяет способ преобразования данных BSON в документе. Есть стандартные и пользовательские кодеки. В следующем коде мы используем кодеки по умолчанию для сопоставления базы данных с Java данными (и в этом случае это работает). Для сложных требований вы можете создать собственный код c.

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);
...