MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Morphia MongoDB prüft auf null und nicht vorhandenes Feld

Aus der Dokumentation , speichert Morphia (standardmäßig) keine Null/Leer-Werte, also die Abfrage

query.and(
    query.criteria("createdDate").exists(),
    query.criteria("createdDate").notEqual(null)
);

wird nicht funktionieren, da es scheint, dass Sie nicht auf null abfragen können, aber Sie können nach einem bestimmten Wert abfragen.

Da Sie jedoch nur einen bestimmten Wert abfragen können, können Sie eine Problemumgehung entwickeln, bei der Sie das createdDate aktualisieren können Feld mit einem Datumswert, der nie in Ihrem Modell verwendet wird. Wenn Sie beispielsweise ein Date-Objekt mit 0 initialisieren, wird es auf den Beginn der Epoche gesetzt, den 1. Januar 1970 00:00:00 UTC. Die Stunden, die Sie erhalten, sind der lokalisierte Zeitversatz. Es reicht aus, wenn Ihr Update nur das Ändern der übereinstimmenden Elemente in der Mongo-Shell beinhaltet, daher würde es ähnlich wie folgt aussehen:

db.users.update(
    {"createdDate": null }, 
    { "$set": {"createdDate": new Date(0)} }
)

Sie können dann die Fluent-Oberfläche verwenden um diesen bestimmten Wert abzufragen:

Query<User> query = mongoDataStore
    .find(User.class)    
    .field("createdDate").exists()
    .field("createdDate").hasThisOne(new Date(0));

Beim Definieren Ihres Modells wäre es viel einfacher, eine prePersist-Methode einzuschließen, die das Feld createdDate aktualisiert. Die Methode ist mit dem @PrePersist gekennzeichnet Anmerkung, damit das Datum auf der Bestellung gesetzt wird, bevor sie gespeichert wird. Äquivalente Anmerkungen existieren für @PostPersist , @PreLoad und @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;
    }
}