Làm cách nào để đọc Ngày từ MongoDB?

Trong hướng dẫn này, chúng ta sẽ sử dụng Trình điều khiển Java MongoDB để thực thi các hoạt động CRUD liên quan đến ngày, chẳng hạn như tạo và cập nhật tài liệu với các trường ngày và truy vấn, cập nhật và xóa tài liệu có các trường ngày nằm trong một phạm vi nhất định

2. Cài đặt

Trước khi đi sâu vào triển khai, hãy thiết lập môi trường làm việc của chúng ta

2. 1. Phụ thuộc Maven

Trước tiên, bạn nên cài đặt MongoDB. Nếu không, bạn có thể làm theo hướng dẫn cài đặt MongoDB chính thức để làm như vậy

Tiếp theo, hãy thêm Trình điều khiển Java MongoDB làm phụ thuộc vào pom của chúng ta. tập tin xml


    org.mongodb
    mongodb-driver-sync
    4.6.0

2. 2. Mô hình dữ liệu POJO

Hãy xác định một POJO để đại diện cho các tài liệu có trong cơ sở dữ liệu của chúng tôi

public class Event {
    private String title;
    private String location;
    private LocalDateTime dateTime;

    public Event() {}
    public Event(String title, String location, LocalDateTime dateTime) {
        this.title = title;
        this.location = location;
        this.dateTime = dateTime;
    }
    
    // standard setters and getters
}

Lưu ý rằng chúng tôi đã khai báo hai hàm tạo. MongoDB sử dụng hàm tạo không đối số theo mặc định. Hàm tạo khác dành cho chúng ta sử dụng trong suốt hướng dẫn này

Cũng xin lưu ý rằng, trong khi dateTime có thể là một biến Chuỗi, thì cách tốt nhất là sử dụng các lớp JDK dành riêng cho ngày/giờ cho các trường ngày. Việc sử dụng các trường Chuỗi để biểu thị ngày đòi hỏi nhiều nỗ lực hơn để đảm bảo các giá trị được định dạng chính xác

Bây giờ chúng tôi đã sẵn sàng để kết nối máy khách với cơ sở dữ liệu của chúng tôi

2. 3. Máy khách MongoDB

Để MongoDB tuần tự hóa/giải tuần tự hóa POJO Sự kiện của chúng ta, chúng ta cần đăng ký PojoCodecProvider với CodecRegistry của MongoDB

CodecProvider codecProvider = PojoCodecProvider.builder().automatic(true).build();
CodecRegistry codecRegistry = fromRegistries(getDefaultCodecRegistry(), fromProviders(codecProvider));

Hãy tạo một cơ sở dữ liệu, bộ sưu tập và ứng dụng khách sẽ sử dụng PojoCodecProvider mà chúng tôi đã đăng ký

MongoClient mongoClient = MongoClients.create(uri);
MongoDatabase db = mongoClient.getDatabase("calendar").withCodecRegistry(codecRegistry);
MongoCollection collection = db.getCollection("my_events", Event.class);

Bây giờ chúng tôi đã sẵn sàng để tạo tài liệu và thực hiện các thao tác CRUD liên quan đến ngày tháng

3. Tạo tài liệu với các trường ngày

Trong POJO của chúng tôi, chúng tôi đã sử dụng LocalDateTime thay vì Chuỗi để làm việc với các giá trị ngày dễ dàng hơn. Hãy tận dụng điều đó ngay bây giờ bằng cách xây dựng các đối tượng Sự kiện bằng cách sử dụng API tiện lợi của LocalDateTime

Event pianoLessonsEvent = new Event("Piano lessons", "Foo Blvd",
  LocalDateTime.of(2022, 6, 4, 11, 0, 0));
Event soccerGameEvent = new Event("Soccer game", "Bar Avenue",
  LocalDateTime.of(2022, 6, 10, 17, 0, 0));

Chúng tôi có thể chèn Sự kiện mới vào cơ sở dữ liệu của mình như sau

InsertOneResult pianoLessonsInsertResult = collection.insertOne(pianoLessonsEvent);
InsertOneResult soccerGameInsertResult = collection.insertOne(soccerGameEvent);

Hãy xác minh việc chèn thành công bằng cách kiểm tra id của tài liệu được chèn

assertNotNull(pianoLessonsInsertResult.getInsertedId());
assertNotNull(soccerGameInsertResult.getInsertedId());

4. Truy vấn tài liệu phù hợp với tiêu chí ngày

Bây giờ chúng ta đã có Sự kiện trong cơ sở dữ liệu của mình, hãy truy xuất chúng dựa trên các trường ngày của chúng

Chúng tôi có thể sử dụng bộ lọc đẳng thức (eq) để truy xuất tài liệu khớp với ngày và giờ cụ thể

LocalDateTime dateTime = LocalDateTime.of(2022, 6, 10, 17, 0, 0);
Event event = collection.find(eq("dateTime", dateTime)).first();

Hãy kiểm tra các trường riêng lẻ của Sự kiện kết quả

________số 8

Chúng ta cũng có thể sử dụng lớp MongoDB BasicDBObject cùng với các toán tử gte và lte để xây dựng các truy vấn phức tạp hơn bằng cách sử dụng Phạm vi ngày

LocalDateTime from = LocalDateTime.of(2022, 06, 04, 12, 0, 0);
LocalDateTime to = LocalDateTime.of(2022, 06, 10, 17, 0, 0);
BasicDBObject object = new BasicDBObject();
object.put("dateTime", BasicDBObjectBuilder.start("$gte", from).add("$lte", to).get());
List list = new ArrayList(collection.find(object).into(new ArrayList()));

Vì trận bóng đá là Sự kiện duy nhất trong phạm vi ngày của truy vấn của chúng tôi, chúng tôi sẽ chỉ thấy một đối tượng Sự kiện trong danh sách, loại trừ bài học piano

public class Event {
    private String title;
    private String location;
    private LocalDateTime dateTime;

    public Event() {}
    public Event(String title, String location, LocalDateTime dateTime) {
        this.title = title;
        this.location = location;
        this.dateTime = dateTime;
    }
    
    // standard setters and getters
}
0

5. Cập nhật tài liệu

Hãy khám phá hai trường hợp sử dụng để cập nhật tài liệu dựa trên các trường ngày tháng của chúng. Trước tiên, chúng tôi sẽ cập nhật trường ngày của một tài liệu, sau đó chúng tôi sẽ cập nhật nhiều tài liệu khớp với một phạm vi ngày

5. 1. Cập nhật trường ngày của tài liệu

Để cập nhật tài liệu MongoDB, chúng ta có thể sử dụng phương thức updateOne(). Chúng ta cũng hãy sử dụng phương thức currentDate() để thiết lập trường dateTime của sự kiện bài học piano của chúng ta

public class Event {
    private String title;
    private String location;
    private LocalDateTime dateTime;

    public Event() {}
    public Event(String title, String location, LocalDateTime dateTime) {
        this.title = title;
        this.location = location;
        this.dateTime = dateTime;
    }
    
    // standard setters and getters
}
1

Lưu ý rằng đối số đầu tiên của updateOne() là một đối tượng Tài liệu mà MongoDB sẽ sử dụng để khớp với một mục trong cơ sở dữ liệu của chúng tôi. Nếu nhiều tài liệu giống nhau, MongoDB sẽ chỉ cập nhật tài liệu đầu tiên mà nó gặp. Cũng lưu ý rằng chúng ta đã truyền false cho phương thức upert(). Thay vào đó, nếu chúng tôi chuyển thành true, MongoDB sẽ chèn một tài liệu mới nếu không có tài liệu hiện có nào phù hợp

Chúng tôi có thể xác nhận thao tác đã thành công bằng cách kiểm tra xem có bao nhiêu tài liệu đã được sửa đổi

public class Event {
    private String title;
    private String location;
    private LocalDateTime dateTime;

    public Event() {}
    public Event(String title, String location, LocalDateTime dateTime) {
        this.title = title;
        this.location = location;
        this.dateTime = dateTime;
    }
    
    // standard setters and getters
}
2

5. 2. Cập nhật tài liệu phù hợp với tiêu chí ngày

Để cập nhật nhiều tài liệu, MongoDB cung cấp phương thức updateMany. Trong ví dụ này, chúng tôi sẽ cập nhật nhiều sự kiện phù hợp với phạm vi ngày từ truy vấn của chúng tôi

Không giống như updateOne(), phương thức updateMany() yêu cầu một đối tượng Bson thứ hai đóng gói các tiêu chí truy vấn sẽ xác định tài liệu nào chúng ta muốn cập nhật. Trong trường hợp này, chúng tôi sẽ chỉ định phạm vi ngày bao gồm tất cả các sự kiện trong năm 2022 bằng cách giới thiệu toán tử trường lt

public class Event {
    private String title;
    private String location;
    private LocalDateTime dateTime;

    public Event() {}
    public Event(String title, String location, LocalDateTime dateTime) {
        this.title = title;
        this.location = location;
        this.dateTime = dateTime;
    }
    
    // standard setters and getters
}
3

Giống như với updateOne(), chúng ta có thể xác nhận thao tác này đã cập nhật nhiều sự kiện bằng cách kiểm tra số lượng cập nhật của đối tượng kết quả của chúng ta

public class Event {
    private String title;
    private String location;
    private LocalDateTime dateTime;

    public Event() {}
    public Event(String title, String location, LocalDateTime dateTime) {
        this.title = title;
        this.location = location;
        this.dateTime = dateTime;
    }
    
    // standard setters and getters
}
4

6. Xóa tài liệu phù hợp với tiêu chí ngày

Cũng như các bản cập nhật, chúng tôi có thể xóa một hoặc nhiều tài liệu khỏi cơ sở dữ liệu của mình cùng một lúc. Giả sử chúng ta cần xóa tất cả các sự kiện từ năm 2022. Hãy sử dụng truy vấn phạm vi ngày Bson và phương thức deleteMany() để thực hiện điều đó

public class Event {
    private String title;
    private String location;
    private LocalDateTime dateTime;

    public Event() {}
    public Event(String title, String location, LocalDateTime dateTime) {
        this.title = title;
        this.location = location;
        this.dateTime = dateTime;
    }
    
    // standard setters and getters
}
5

Vì tất cả các sự kiện mà chúng tôi đã tạo trong hướng dẫn này đều có giá trị trường dateTime là 2022, nên deleteMany() đã xóa tất cả chúng khỏi bộ sưu tập của chúng tôi. Chúng tôi có thể xác nhận điều này bằng cách kiểm tra số lần xóa

public class Event {
    private String title;
    private String location;
    private LocalDateTime dateTime;

    public Event() {}
    public Event(String title, String location, LocalDateTime dateTime) {
        this.title = title;
        this.location = location;
        this.dateTime = dateTime;
    }
    
    // standard setters and getters
}
6

7. Sử dụng Múi giờ

MongoDB lưu trữ ngày trong UTC và điều này không thể thay đổi. Do đó, nếu chúng tôi muốn các trường ngày của mình dành riêng cho múi giờ, chúng tôi có thể lưu trữ phần bù múi giờ trong một trường riêng biệt và tự thực hiện chuyển đổi. Hãy thêm trường đó dưới dạng Chuỗi

public class Event {
    private String title;
    private String location;
    private LocalDateTime dateTime;

    public Event() {}
    public Event(String title, String location, LocalDateTime dateTime) {
        this.title = title;
        this.location = location;
        this.dateTime = dateTime;
    }
    
    // standard setters and getters
}
7

Chúng tôi sẽ cần điều chỉnh hàm tạo của mình để có thể đặt trường mới khi tạo sự kiện

public class Event {
    private String title;
    private String location;
    private LocalDateTime dateTime;

    public Event() {}
    public Event(String title, String location, LocalDateTime dateTime) {
        this.title = title;
        this.location = location;
        this.dateTime = dateTime;
    }
    
    // standard setters and getters
}
8

Giờ đây, chúng tôi có thể tạo và chèn các sự kiện cho các múi giờ cụ thể vào cơ sở dữ liệu của mình. Hãy sử dụng lớp ZoneOffset để tránh phải định dạng chuỗi bù múi giờ theo cách thủ công

public class Event {
    private String title;
    private String location;
    private LocalDateTime dateTime;

    public Event() {}
    public Event(String title, String location, LocalDateTime dateTime) {
        this.title = title;
        this.location = location;
        this.dateTime = dateTime;
    }
    
    // standard setters and getters
}
9

Lưu ý rằng vì phần bù có liên quan đến UTC nên biến thành viên dateTime phải biểu thị thời gian UTC để chúng tôi có thể chuyển đổi chính xác sau này. Khi chúng tôi truy xuất tài liệu từ bộ sưu tập, chúng tôi có thể thực hiện chuyển đổi bằng cách sử dụng trường offset và lớp OffsetDateTime

CodecProvider codecProvider = PojoCodecProvider.builder().automatic(true).build();
CodecRegistry codecRegistry = fromRegistries(getDefaultCodecRegistry(), fromProviders(codecProvider));
0

8. Phần kết luận

Trong bài viết này, chúng ta đã học cách thực hiện các thao tác CRUD liên quan đến ngày tháng bằng Java và cơ sở dữ liệu MongoDB

Chúng tôi đã sử dụng các giá trị ngày để tạo, truy xuất, cập nhật hoặc xóa tài liệu trong cơ sở dữ liệu của mình. Trong suốt các ví dụ của mình, chúng tôi đã đề cập đến các lớp trợ giúp khác nhau và giới thiệu các toán tử MongoDB hữu ích khi xử lý ngày tháng. Cuối cùng, để tìm hiểu về cách MongoDB chỉ lưu trữ ngày trong UTC, chúng ta đã học cách làm việc với các giá trị ngày/giờ cần theo múi giờ cụ thể

Làm cách nào để truy vấn một ngày trong MongoDB?

Truy vấn ngày MongoDB trả về ngày ở dạng chuỗi hoặc đối tượng ngày, truy vấn ngày sẽ trả về ngày hiện tại dưới dạng chuỗi trong trình bao mongo. .
new Date () .. .
new Date () .. .
new Date () .. .
new Date(“”).

Làm cách nào để lấy dữ liệu ngày hiện tại trong MongoDB?

Ngày hiện tại trong truy vấn MongoDB . Date() sẽ trả về ngày hiện tại dưới dạng chuỗi . Date() mới sẽ trả về ngày hiện tại là một đối tượng ngày và MongoDB bao phủ đối tượng Date bằng ISODate.

Làm cách nào để trích xuất ngày từ datetime trong MongoDB?

8 cách lấy ngày từ một ngày trong MongoDB .
Dữ liệu mẫu. .
Toán tử $dayOfWeek. .
Toán tử $dayOfMonth. .
Toán tử $dayOfYear. .
Toán tử $dateToString. .
Toán tử $dateToParts. .
Phương thức forEach(). .
Phương thức map()

Làm cách nào để đọc ngày từ MongoDB trong Java?

Mã Java ví dụ sau được sử dụng để truy vấn trường ngày MongoDB, mà bạn thấy giá trị của nó là, e. g. , ISODate("2020-09-23T10. 42. 16. 983Z") trong vỏ mongo. Và, ngày này được lưu trữ trong cơ sở dữ liệu MongoDB với kiểu Ngày. DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd H. m. s"); Ngày từDate = dateFormat .