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

在MongoDB中查询和更新不同的文档,mongodb,morphia,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",

我是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"....
[{"Field":"blah,"version":1 } $or {"Field":"blah1", "version":10} ]
我正在尝试发送一个查询列表,并批量获取所有记录。有可能吗

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

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

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

{$or: [{"field": "blah,"version":1 }, {"field":"blah1", "version":10} ]}
请注意表达式的子查询数组

Morphia中有一些怪癖意味着您必须将其包装在$and子句中。因此,您的代码如下所示:

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

我最终修正了我对这个问题的质疑。想和其他人分享吗

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;
}
List fetchDocs(地图查询){
条件[]c=新条件[querys.size()];
queryquery0=this.mongoDao.createQuery(MyClass.class);
int计数器=0;
对于(Map.Entry:inMap.entrySet()){
Query queryC=this.mongoDao.createQuery(MyClass.class);
String key=entry.getKey();
字符串val=entry.getValue();
标准cC=查询标准(“字段”).equal(键)。标准(“版本”).equal(值);
c[计数器]=cC;
计数器++;
}
问题0.或(c);
List qresult=query0.asList();
返回qresult;
}

Hi Nicholas,我的做法与您的建议类似,创建了一个装满子查询的CriteriaContainer,但它没有给我正确的结果。我只看到一条记录与上一个查询条件相匹配。