2013-01-14 19 views
1

我在查詢具有嵌套對象的集合。領域模型是這樣的:MongoTemplate條件查詢翻譯似乎不正確

@Document(collection="a") 
public class A { 

    protected Map<String, B> fields; 
    protected String uuid; 
    protected Date updatedTs; 

    //Getters and setters and other fields omitted 
} 

public class B{ 

    protected String c; 
    protected String d; 

} 

我使用的是這樣的一個標準查詢:

{ "uuid" : "9DA291A4-1BAB-4B9C-844D-681C3F1ABF6E"} 

我創建使用

Criteria.where("uuid").is(uuid); 

我可以看到標準對象不包含其他東西,因爲我可以像這樣打印出來:

log.debug("Criteria: " + SerializationUtils.serializeToJsonSafely(c.getCriteriaObject())); 

如果我打開調試日誌記錄包org.springframework.data.mongodb.core,我可以看到,實際上是被髮送到服務器的查詢是:

{ "uuid" : "9DA291A4-1BAB-4B9C-844D-681C3F1ABF6E"} fields: null 

編輯:我的文檔中包含一個名爲場'fields',並且似乎我的代碼或mongoTemplate/spring-data中的內容實際上是在搜索字段:null。 MongoTemplate的日誌行混淆了我,因爲fields:null實際上是指一組要返回的字段名稱。

那麼,如何在沒有spring-data的情況下搜索與該uuid匹配的文檔,只返回屬性「fields」爲空的文檔?

同時,還研究如何避開這一點,因爲我不能改變文檔結構...

+0

由於只有類A具有UUID字段,所以您的查詢將僅返回類A中的文檔。字段:null意味着其他所有內容一起。我總是在調試模式下看到這一點。很有可能你只查詢某個特定的UUID,而字段恰好爲空。 – ltfishie

+0

這可能是我的映射錯誤,但我不確定。我的文檔結構如下所示:{uuid:「abc123」,fields:{「a」:b「,」c「:{」d「:true}}}這就是我所說的嵌套文檔。知道任何其他的方式來映射這個明智的,而不是像我所做的那樣。我知道查詢將只返回來自集合'A' –

+0

的文檔,爲什麼不嘗試查詢{fields.a:「b」}並查看如果有效的話 – ltfishie

回答

1

fields你看到日誌輸出無關,與你的域對象。這表明它被放置外部的 JSON字符串。 fields在這種情況下指的是對於找到的每個文檔應該返回的字段,其本質上是projection mechanism.

+0

是的,謝謝,我想到了 - 它只是暫時拋我,因爲它與我的文檔屬性名稱相同。當我查看MongoTemplate的源代碼時,我看到了它記錄的內容 –