Fra dokumentationen , Morphia gemmer ikke Null/Empty-værdier (som standard), så forespørgslen
query.and(
query.criteria("createdDate").exists(),
query.criteria("createdDate").notEqual(null)
);
vil ikke fungere, da det ser ud til, at du ikke er i stand til at forespørge på null, men kan forespørge efter en bestemt værdi.
Men da du kun kan forespørge efter en bestemt værdi, kan du finde en løsning, hvor du kan opdatere createdDate
felt med en datoværdi, der aldrig bruges i din model. For eksempel, hvis du initialiserer et Dato-objekt med 0, vil det blive sat til begyndelsen af epoken, 1. januar 1970 00:00:00 UTC. De timer, du får, er den lokaliserede tidsforskydning. Det vil være tilstrækkeligt, hvis din opdatering kun involverer ændring af de(n) matchende element(er) i mongo shell, derfor vil den se lignende ud:
db.users.update(
{"createdDate": null },
{ "$set": {"createdDate": new Date(0)} }
)
Du kan derefter bruge Flydende grænseflade for at forespørge på den specifikke værdi:
Query<User> query = mongoDataStore
.find(User.class)
.field("createdDate").exists()
.field("createdDate").hasThisOne(new Date(0));
Det ville være meget enklere, når du definerer din model, at inkludere en prePersist-metode, der opdaterer feltet createdDate. Metoden er mærket med @PrePersist
anmærkning, så datoen er sat på ordren, inden den gemmes. Der findes tilsvarende annoteringer for @PostPersist
, @PreLoad
og @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;
}
}