在MongoDB中查询和更新不同的文档
我是MongoDB的新手,请原谅我的无知 我有一个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",
["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,但它没有给我正确的结果。我只看到一条记录与上一个查询条件相匹配。