Từ tài liệu , Morphia không lưu trữ các giá trị Null / Empty (theo mặc định) nên truy vấn
query.and(
query.criteria("createdDate").exists(),
query.criteria("createdDate").notEqual(null)
);
sẽ không hoạt động vì có vẻ như bạn không thể truy vấn trên null, nhưng có thể truy vấn một giá trị cụ thể.
Tuy nhiên, vì bạn chỉ có thể truy vấn một giá trị cụ thể, nên bạn có thể đưa ra giải pháp thay thế để cập nhật createdDate
trường có giá trị ngày không bao giờ được sử dụng trong mô hình của bạn. Ví dụ:nếu bạn khởi tạo đối tượng Date bằng 0, nó sẽ được đặt thành đầu kỷ nguyên, ngày 1 tháng 1 năm 1970 00:00:00 UTC. Giờ bạn nhận được là khoảng thời gian đã được bản địa hóa. Sẽ là đủ nếu bản cập nhật của bạn chỉ liên quan đến việc sửa đổi (các) phần tử phù hợp trong mongo shell, do đó nó sẽ trông tương tự như sau:
db.users.update(
{"createdDate": null },
{ "$set": {"createdDate": new Date(0)} }
)
Sau đó, bạn có thể sử dụng Giao diện Fluent để truy vấn về giá trị cụ thể đó:
Query<User> query = mongoDataStore
.find(User.class)
.field("createdDate").exists()
.field("createdDate").hasThisOne(new Date(0));
Sẽ đơn giản hơn nhiều khi xác định mô hình của bạn để bao gồm một phương thức đăng ký trước cập nhật trường Ngày tạo. Phương thức được gắn thẻ với @PrePersist
chú thích để ngày được đặt theo thứ tự trước khi nó được lưu. Các chú thích tương đương tồn tại cho @PostPersist
, @PreLoad
và @PostLoad
.
@Entity(value="users", noClassNameStored = true)
public class User {
// Properties
private Date createdDate;
...
// Getters and setters
..
@PrePersist
public void prePersist() {
this.createdDate = (createdDate == null) ? new Date() : createdDate;
}
}