在MongoDB中查询和更新不同的文档

时间:2013-10-13 20:52:09

标签: mongodb morphia

我是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"....]

2 个答案:

答案 0 :(得分:0)

是的,这绝对是可以的。但是,最终查询对象看起来更像是这样:

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

注意$or表达式的子查询数组。

Morphia中存在一些怪癖,这意味着你必须将它包装在$和子句中。所以你的代码就像这样:

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

答案 1 :(得分: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;
}