MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Morphia MongoDB verifica se há campo nulo e não existente


Da documentação , o Morphia não armazena valores Null/Empty (por padrão), então a consulta
query.and(
    query.criteria("createdDate").exists(),
    query.criteria("createdDate").notEqual(null)
);

não funcionará, pois parece que você não pode consultar em null, mas pode consultar um valor específico.

No entanto, como você só pode consultar um valor específico, pode criar uma solução alternativa para atualizar a createdDate campo com um valor de data que nunca é usado em seu modelo. Por exemplo, se você inicializar um objeto Date com 0, ele será definido para o início da época, 1º de janeiro de 1970 00:00:00 UTC. As horas que você recebe são o deslocamento de tempo localizado. Será suficiente se sua atualização envolver apenas a modificação do(s) elemento(s) correspondente(s) no shell do mongo, portanto, seria semelhante a isto:
db.users.update(
    {"createdDate": null }, 
    { "$set": {"createdDate": new Date(0)} }
)

Você pode então usar a Interface Fluente para consultar esse valor específico:
Query<User> query = mongoDataStore
    .find(User.class)    
    .field("createdDate").exists()
    .field("createdDate").hasThisOne(new Date(0));

Seria muito mais simples ao definir seu modelo incluir um método prePersist que atualiza o campo createdDate. O método é marcado com o @PrePersist anotação para que a data seja definida no pedido antes de ser salvo. Existem anotações equivalentes para @PostPersist , @PreLoad e @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;
    }
}