Z dokumentacji , Morphia nie przechowuje wartości Null/Empty (domyślnie), więc zapytanie
query.and(
query.criteria("createdDate").exists(),
query.criteria("createdDate").notEqual(null)
);
nie zadziała, ponieważ wygląda na to, że nie możesz wykonać zapytania o wartość null, ale możesz zapytać o konkretną wartość.
Ponieważ jednak możesz wysyłać zapytania tylko o konkretną wartość, możesz wymyślić obejście, w którym można zaktualizować createdDate
pole z wartością daty, która nigdy nie jest używana w modelu. Na przykład, jeśli zainicjujesz obiekt Date z 0, zostanie on ustawiony na początek epoki, 1 stycznia 1970 00:00:00 UTC. Otrzymane godziny to zlokalizowane przesunięcie czasu. Wystarczy, jeśli twoja aktualizacja obejmuje tylko modyfikację pasujących elementów w powłoce mongo, więc wyglądałoby to podobnie do tego:
db.users.update(
{"createdDate": null },
{ "$set": {"createdDate": new Date(0)} }
)
Następnie możesz użyć Fluent Interface aby zapytać o tę konkretną wartość:
Query<User> query = mongoDataStore
.find(User.class)
.field("createdDate").exists()
.field("createdDate").hasThisOne(new Date(0));
Przy definiowaniu modelu znacznie prostsze byłoby dołączenie metody prePersist, która aktualizuje pole createdDate. Metoda jest oznaczona tagiem @PrePersist
adnotację, aby data była ustawiona na zamówieniu przed jego zapisaniem. Istnieją równoważne adnotacje dla @PostPersist
, @PreLoad
i @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;
}
}