2013-10-13 26 views
0

我是MongoDB的新手,請原諒我的無知。查詢和更新MongoDB中的不同文檔

我有一個MongoDB中包含了一堆文件,像這樣的東西

["field": "blah", "version":"1" ...] 
["field": "blah", "version":"2" ...] 
["field": "blah", "version":"1"....] 
["field": "blah1", "version":"10"...] 
["field": "blah2", "version":"100"...] 
["field": "blah3", "version":"1"....] 
["field": "blah3", "version":"2"....] 
["field": "blah2", "version":"1".... 

我試圖發送查詢列表,並獲取所有記錄作爲一個批次。是否有可能這樣做?

List<Docs> fetchDocs(Map<String, String> queries) 
{ 
    CriteriaContainer cc=null; 
    Query<Docs> query = this.mongoDao.createQuery(MyClass.class); 
    for (Map.Entry<String,String >entry : queries.entrySet()) 
    { 
      if(cc ==null) 
      { 
      cc= query.criteria("Field").equal(entry.getKey()).and(query.criteria("version").equal(entry.getValue())); 
      } 
      else 
      { 
      cc.or(query.criteria("Field").equal(entry.getKey()).and(query.criteria("version").equal(entry.getValue()));) 
      } 

    } 
    query.and(cc); 
    List<Docs> doc = query.asList(); 

    return doc; 
} 

我不是正確的名單。我不知道我是否已經正確地寫了這個查詢。

基本上,我希望獲取結果或查詢這樣

[{"Field":"blah,"version":1 } $or {"Field":"blah1", "version":10} ] 

它應該返回我含

["field": "blah", "version":"1" ....] 

["field": "blah1", "version":"10"....] 

回答

0

我最終修復了這個問題。想與其餘

List<Docs> fetchDocs(Map<String, String> queries){ 
     Criteria [] c = new Criteria[queries.size()]; 
     Query<TUCacheDoc> query0 = this.mongoDao.createQuery(MyClass.class); 
     int counter=0; 
     for (Map.Entry<String, String> entry : inMap.entrySet()) { 
      Query<TUCacheDoc> queryC = this.mongoDao.createQuery(MyClass.class); 
      String key= entry.getKey(); 
      String val= entry.getValue(); 
      Criteria cC = queryC.criteria("field").equal(key).criteria("version").equal(val); 
      c[counter]=cC; 
      counter++; 
     } 

     query0.or(c); 
     List<TUCacheDoc> qresult = query0.asList(); 

return qresult; 
} 
0

是的,這是絕對有可能做一個列表。最終查詢對象將看起來更像這一點,但是:

{$or: [{"field": "blah,"version":1 }, {"field":"blah1", "version":10} ]} 

通知子查詢對$or表達的陣列。

Morphia有一些怪癖意味着你必須把它包裝在$和子句中。所以你的代碼會是這樣的:

Query q = dao.createQuery(); 
q.and(
    q.or(subQuery1), 
    q.or(subQuery2), 
... 
); 
+0

喜尼古拉斯分享它,我在做類似你通過創建充滿子查詢CriteriaContainer建議是什麼,但它不給我正確的結果。我只看到一條匹配上一個查詢條件的記錄。 – sachin