sql >> Base de Datos >  >> NoSQL >> MongoDB

Verificación de Morphia MongoDB para campos nulos y no existentes

De la documentación , Morphia no almacena valores nulos/vacíos (por defecto), por lo que la consulta

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

no funcionará ya que parece que no puede consultar en nulo, pero puede consultar un valor específico.

Sin embargo, dado que solo puede consultar un valor específico, puede idear una solución donde puede actualizar la createdDate campo con un valor de fecha que nunca se usa en su modelo. Por ejemplo, si inicializa un objeto Fecha con 0, se establecerá al comienzo de la época, 1 de enero de 1970 00:00:00 UTC. Las horas que obtiene son el desplazamiento de tiempo localizado. Será suficiente si su actualización solo implica modificar los elementos coincidentes en mongo shell, por lo tanto, se vería similar a esto:

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

Luego puede usar la Fluent Interface para consultar sobre ese valor específico:

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

Sería mucho más simple al definir su modelo para incluir un método prePersist que actualice el campo createdDate. El método está etiquetado con @PrePersist anotación para que la fecha se establezca en el pedido antes de que se guarde. Existen anotaciones equivalentes para @PostPersist , @PreLoad y @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;
    }
}