MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Morphia MongoDB controlla il campo nullo e non esistente

Dalla documentazione , Morphia non memorizza valori Null/Empty (per impostazione predefinita), quindi la query

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

non funzionerà poiché sembra che tu non sia in grado di eseguire query su null, ma puoi eseguire query per un valore specifico.

Tuttavia, poiché puoi eseguire query solo per un valore specifico, puoi escogitare una soluzione alternativa in cui puoi aggiornare il createdDate campo con un valore di data che non viene mai utilizzato nel modello. Ad esempio, se inizializzi un oggetto Date con 0, verrà impostato all'inizio dell'epoca, 1 gennaio 1970 00:00:00 UTC. Le ore che ottieni sono l'offset di tempo localizzato. Sarà sufficiente se il tuo aggiornamento prevede solo la modifica degli elementi corrispondenti in mongo shell, quindi sembrerebbe simile a questo:

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

È quindi possibile utilizzare l'Interfaccia fluente per interrogare quel valore specifico:

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

Sarebbe molto più semplice quando si definisce il modello per includere un metodo prePersist che aggiorna il campo CreateDate. Il metodo è contrassegnato da @PrePersist annotazione in modo che la data sia impostata sull'ordine prima del suo salvataggio. Esistono annotazioni equivalenti per @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;
    }
}