2014-02-11 115 views
3

我有一個MongoDB的集合與以下結構春數據MongoDB中找到查詢返回任何結果

{ 
    "_id" : "...", 
    "_class" : "...", 
    ... 
    "travelers" : [ 
     { 
      "id": "12345", 
      "type": "XYZ" 
     }, 
     { 
      "id": "67890", 
      "type": "ABC" 
     }], 
    ... 
} 

使用Spring數據的多個文件,我可以去取有旅客類型XYZ文件:

Query query = new Query(Criteria.where("travelers.type").is("XYZ"); 
List<Something> something = mongoTemplate.find(query, Something.class, COLLECTION_NAME); 

但是如果我切換查詢由旅行者號去取,我沒有得到任何結果:

Query query = new Query(Criteria.where("travelers.id").is("12345"); 
List<Something> something = mongoTemplate.find(query, Something.class, COLLECTION_NAME); 

我啓用所有日誌和傳出的查詢是{"travelers.id" : "12345"}看起來是正確的。直接在db上運行查詢{"travelers.id" : "12345"}會返回正確的結果。

我在集合上嘗試過的其他查詢似乎工作正常。我已經嘗試了&這兩個都沒有索引,在這兩種情況下都沒有結果。我究竟做錯了什麼?

+0

你可以請doublecheck該ID確實是一個字符串(因此需要引號),而不是一個整數? – Jinxcat

+0

已檢查。 id是一個字符串。 – ashutosh

+0

您確定COLLECTION_NAME與mongo中的收藏相匹配嗎? –

回答

4

的字段「身份證」的名稱得到特殊待遇的映射 - 看到http://docs.spring.io/spring-data/data-mongodb/docs/current/reference/html/#mongo-template.id-handling

什麼情況是,春天的數據映射轉換ID爲「_id」您所查詢的,當你做:

Query query = new Query(Criteria.where("travelers.id").is("12345"); 

所以查詢要蒙戈不

{"travelers.id" : "12345"} 

{"travelers._id" : "12345"} 

春天的數據mongo記錄的查詢與mongo的實際情況有些不同。

奇怪的是,保存數據時,彈簧數據不會執行此映射。

將id字段重命名爲像travelerId這樣的東西將解決問題。

+0

這有點煩人,我可以理解它是什麼時候它是頂級文檔,但是當它是文檔中的對象時,它們不應該自動以這種方式強制映射,它們應該按原樣進行。 –