2015-05-01 46 views
2

我是新來的都嗎啡和MongoDB。有沒有一種方法來檢查使用嗎啡,在我的數據庫中的某一個領域是不是null也存在。例如從用戶的集合在數據庫中的用戶的以下記錄:嗎啡MongoDB的檢查null和非現有字段

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

我將如何使用嗎啡查詢,以檢查是否領域"createdDate"不是null存在。

編輯: 我正在尋找Morphia的解決方案。到目前爲止,我想出了這一點:

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

從技術文檔,我學到了嗎啡不存儲空或空字段。因此爲notEqual(null)的理由。

編輯2:從答案我可以看到問題需要更多的解釋。我無法修改createdDate。詳細說明:上面的例子並不比我的實際問題複雜。我真正的問題是我無法修改的敏感領域。另外要的東西多一點複雜,我沒有在模型的控制,否則作爲一個答案建議我可以用@PrePersist

有沒有一種方法來檢查null和非現有的現場時,我有過的模型中沒有控制,我不允許修改字段?

回答

2

documentation,嗎啡不存儲空/空值(默認情況下),所以查詢

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

是行不通的,因爲它似乎你是不是能夠在空查詢,但也可以查詢具體的價值。

但是,由於您只能查詢特定值,因此可以設計一種解決方法,您可以使用在模型中從不使用的日期值更新createdDate字段。例如,如果使用0初始化Date對象,則它將被設置爲時間的開始,即1970年1月1日00:00:00 UTC。你得到的時間是本地化的時間偏移量。這將是足夠的,如果你的更新只涉及到修改在蒙戈外殼匹配的元素(一個或多個),因此它同樣也會看這個:

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

然後,您可以使用Fluent Interface對特定值查詢:

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

將模型定義爲包含更新createdDate字段的prePersist方法會簡單得多。該方法使用@PrePersist註釋標記,以便日期在保存前的順序上設置。等效註解@PostPersist@PreLoad@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

感謝您指出我的錯誤並詳細解釋瞭解決方法。儘管有一個問題,我無法修改'createdDate'。詳細說明:上面的例子並不比我的實際問題複雜。我真正的問題是我無法修改的敏感領域。此外,讓事情複雜一點,我不能控制模型,否則我同意你的解決方案'@ PrePersist'。有其他解決方法嗎? – Segmented

+0

@Segmented恐怕我不知道上面的任何其他解決方法,似乎修改文檔是要走的路,但是再一次它超出了你的控制範圍。我只能想到另一種解決方法,您可以查詢「createdDate」存在的文檔,並且不在特定的日期範圍內,比如從現在到新紀元開始(即新日期(0))。這樣你可以捕獲空值? – chridam

+1

非常感謝你的支持和我的複雜問題。儘管你的解決方案聽起來很誘人(關於'createdDate'屬於特定的日期範圍),我很想尋找一些通用的解決方案。在我接受你的解決方案之前,我希望你能和你在一起... – Segmented

0

在蒙戈您可以使用此查詢:

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

這個查詢將返回具有該領域對象的MyField的「和具有的值不爲空。

+0

感謝您的回答!有沒有Morphia的方法來做到這一點? – Segmented

0

當你第一次創建嗎啡實例,調用morphia.mapPackage()做到這一點之前:

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

有嗎啡存儲空值。

無論如何,你應該能夠查詢非空值有:

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