0

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

2 回答 2

0

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

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

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

Morphia 中有一些怪癖意味着您必须将其包装在 $and 子句中。所以你的代码会是这样的:

Query q = dao.createQuery();
q.and(
  q.or(subQuery1),
  q.or(subQuery2),
 ...
);
于 2013-10-14T06:27:44.593 回答
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;
}
于 2013-10-22T04:04:42.940 回答