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ố 8Chú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
}
05. 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
}
1Lư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
}
25. 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
}
3Giố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
}
46. 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
}
5Vì 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
}
67. 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
}
7Chú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
}
8Giờ đâ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
}
9Lư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]];
08. 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ể