Från dokumentationen , Morphia lagrar inte Null/Empty-värden (som standard) så frågan
query.and(
query.criteria("createdDate").exists(),
query.criteria("createdDate").notEqual(null)
);
kommer inte att fungera eftersom det verkar som att du inte kan fråga på null, men kan fråga efter ett specifikt värde.
Men eftersom du bara kan fråga efter ett specifikt värde kan du komma på en lösning där du kan uppdatera createdDate
fält med ett datumvärde som aldrig används i din modell. Till exempel, om du initierar ett Date-objekt med 0, kommer det att ställas in på början av epoken, 1 januari 1970 00:00:00 UTC. Timmarna du får är den lokaliserade tidsförskjutningen. Det kommer att räcka om din uppdatering endast innebär att modifiera de matchande elementen i mongo-skalet, så det skulle se ut på samma sätt som detta:
db.users.update(
{"createdDate": null },
{ "$set": {"createdDate": new Date(0)} }
)
Du kan sedan använda Flytande gränssnitt för att fråga om det specifika värdet:
Query<User> query = mongoDataStore
.find(User.class)
.field("createdDate").exists()
.field("createdDate").hasThisOne(new Date(0));
Det skulle vara mycket enklare när du definierar din modell att inkludera en prePersist-metod som uppdaterar fältet createDate. Metoden är taggad med @PrePersist
anteckning så att datumet ställs in på beställningen innan det sparas. Motsvarande kommentarer finns för @PostPersist
, @PreLoad
och @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;
}
}