/ / Morphia MongoDB verifica para campos nulos e não existentes - mongodb, morphia

Morphia MongoDB verificar campo nulo e não existente - mongodb, morphia

Sou novo no Morphia e no MongoDB. Existe uma maneira de verificar usando Morphia se um determinado campo em meu banco de dados não está null e também existe. Por exemplo, a partir do seguinte registro de um usuário de uma coleção de usuários no banco de dados:

{ "_id" : ObjectId("51398e6e30044a944cc23e2e"),
"age" : 21 ,
"createdDate" : ISODate("2013-03-08T07:08:30.168Z"),
"name" : "Some name" }

Como eu usaria uma consulta Morphia para verificar se o campo "createdDate" não é nulo e existe.

EDITAR: Estou procurando uma solução em Morphia. Até agora eu vim com isso:

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

Pela documentação, aprendi que o Morphia não armazena campos vazios ou nulos. Daí a justificativa para notEqual(null).

EDIT 2: Pelas respostas, posso ver que o problema precisa de mais explicações. Eu não posso modificar o createdDate. Para elaborar:o exemplo acima é menos complexo do que meu problema real. Meu verdadeiro problema tem campos sensíveis que não posso modificar. Também para complicar um pouco mais as coisas, não tenho controle sobre o modelo, caso contrário, poderia ter usado @PrePersist conforme proposto em uma das respostas.

Existe uma maneira de verificar se há campos nulos e inexistentes quando não tenho controle sobre o modelo e não tenho permissão para modificar os campos?

Respostas:

2 para resposta № 1

De documentação, Morphia não armazena valores nulos / vazios (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 nulo, mas pode consultar um valor específico.

No entanto, uma vez que você só pode consultar um valor específico, você pode criar uma solução alternativa para atualizar o createdDate campo com um valor de data que nunca é usado emseu 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ê obtém são a diferença de horário localizada. 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 este:

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

Você pode então usar o 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 para 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;
}
}

0 para resposta № 2

No mongo, você pode usar esta consulta:

db.MyCollection.find({"myField" : {$ne : null}})

Esta consulta retornará objetos que possuem o campo "myField" e possuem um valor que não é nulo.


0 para resposta № 3

Quando você cria sua instância Morphia pela primeira vez, antes de chamar morphia.mapPackage() faça isso:

morphia.getMapper().getOptions().setStoreNulls(true);

para que o Morphia armazene valores nulos.

De qualquer forma, você deve ser capaz de consultar valores não nulos com:

query.field("createdDate").notEqual(null);