MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Morphia MongoDB vérifie les champs nuls et non existants

De la documentation , Morphia ne stocke pas les valeurs Null/Vide (par défaut) donc la requête

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

ne fonctionnera pas car il semble que vous ne puissiez pas interroger sur null, mais que vous pouvez interroger une valeur spécifique.

Cependant, puisque vous ne pouvez interroger qu'une valeur spécifique, vous pouvez concevoir une solution de contournement dans laquelle vous pouvez mettre à jour le createdDate champ avec une valeur de date qui n'est jamais utilisée dans votre modèle. Par exemple, si vous initialisez un objet Date avec 0, il sera défini au début de l'époque, le 1er janvier 1970 00:00:00 UTC. Les heures que vous obtenez sont le décalage horaire localisé. Il suffira que votre mise à jour implique uniquement de modifier le ou les éléments correspondants dans mongo shell, donc cela ressemblerait à ceci :

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

Vous pouvez ensuite utiliser l'l'interface fluide pour interroger sur cette valeur spécifique :

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

Il serait beaucoup plus simple lors de la définition de votre modèle d'inclure une méthode prePersist qui met à jour le champ createdDate. La méthode est étiquetée avec le @PrePersist annotation afin que la date soit fixée sur la commande avant qu'elle ne soit enregistrée. Des annotations équivalentes existent pour @PostPersist , @PreLoad et @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;
    }
}