sql >> Databáze >  >> NoSQL >> MongoDB

Morphia MongoDB zkontroluje nulové a neexistující pole

Z dokumentace , Morphia neukládá hodnoty Null/Empty (ve výchozím nastavení), takže dotaz

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

nebude fungovat, protože se zdá, že nejste schopni dotazovat se na null, ale můžete dotazovat na konkrétní hodnotu.

Protože se však můžete dotazovat pouze na konkrétní hodnotu, můžete navrhnout řešení, kde můžete aktualizovat createdDate pole s hodnotou data, která se ve vašem modelu nikdy nepoužívá. Pokud například inicializujete objekt Date s 0, bude nastaven na začátek epochy, 1. ledna 1970 00:00:00 UTC. Hodiny, které získáte, jsou lokalizovaný časový posun. Bude postačující, pokud vaše aktualizace bude zahrnovat pouze úpravu odpovídajících prvků v mongo shell, takže bude vypadat podobně jako toto:

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

Poté můžete použít Fluent rozhraní pro dotaz na tuto konkrétní hodnotu:

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

Při definování modelu by bylo mnohem jednodušší zahrnout metodu prePersist, která aktualizuje pole createdDate. Metoda je označena @PrePersist anotace tak, aby bylo datum nastaveno na objednávce před jejím uložením. Pro @PostPersist existují ekvivalentní anotace , @PreLoad a @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;
    }
}


  1. Jak se připojit k MongoDB ve Windows?

  2. Jak nainstalovat MongoDB Community Edition na Ubuntu

  3. Jak získat data Mongo pomocí agregátu MongoDB verze 3.0

  4. Odstranění prvku pole v mongoDB na základě pozice prvku