我一直在尝试组合Query接口的and()和or()方法来创建一组条件,其中有2个条件列表,并且必须满足每个条件中的至少一个条件.
我读了this discussion并且一直在尝试使用Query.and()来组合我的两个$或子句.
基本上,我想说:
Criteria[] arrayA;
Criteria[] arrayB;
// Programatically populate both arrays
Query q = dao.createQuery().and(
q.or(arrayA),
q.or(arrayB)
);
我正在使用标准数组,因为我必须遍历几个不同的输入以生成我需要的特定条件,这种方法适用于我只使用单个$或者,但我无法让Morphia生成查询我希望当我尝试在$中包含$或子句时,如上所述.我发现没有$和查询,第二个$或者已经覆盖了第一个,就好像我只是简单地调用了或()两次.
例如,我希望生成一个如下查询:
{
"$and": {
"0": {
"$or": {
"0": //Some criteria,
"1": //Some criteria,
"2": //Some criteria,
}
},
"1": {
"$or": {
"0": //Some other criteria,
"1": //Some other criteria,
"2": //Some other criteria,
}
}
}
但是,我只是得到这样的查询:
{
"$or": {
"0": //Some other criteria,
"1": //Some other criteria,
"2": //Some other criteria,
}
}
我看不到很多文档,但是看一下测试用例,这似乎是解决这个问题的正确方法.任何人都可以帮助解释为什么这不符合我的预期吗?
编辑0:
更新:重新审视这个,我已经检查了Morphia测试代码,并且每件事情都运行良好,我一直无法在测试代码中重现我的问题.
因此,我创建了一个新项目来尝试获取我想要的查询的工作示例.但是,即使使用准系统测试项目,我也遇到了同样的问题.
该项目已经成熟,POM是:
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
test
test
0.0.1-SNAPSHOT
Test
com.google.code.morphia
morphia
0.99
org.mongodb
mongo-java-driver
2.7.3
我有一个TestEntity类:
import java.util.Map;
import com.google.code.morphia.annotations.Entity;
@Entity
public class TestEntity {
Map map;
}
最后我的测试类:
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Map;
import com.google.code.morphia.Datastore;
import com.google.code.morphia.Morphia;
import com.google.code.morphia.query.Query;
import com.google.code.morphia.query.QueryImpl;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
public class Test {
static Mongo mongo;
static Morphia m;
static Datastore ds;
static {
mongo = null;
try {
mongo = new Mongo();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (MongoException e) {
e.printStackTrace();
}
m = new Morphia();
ds = m.createDatastore(mongo, "test");
}
public static void main(String[] args) {
populate();
query();
}
public static void query() {
Query q = ds.createQuery(TestEntity.class);
q.and(q.or(q.criteria("map.field1").exists()),
q.or(q.criteria("map.field2").exists()));
Iterable i = q.fetch();
for (TestEntity e : i) {
System.out.println("Result= " + e.map);
}
QueryImpl qi = (QueryImpl) q;
System.out
.println("Query= " + qi.prepareCursor().getQuery().toString());
}
public static void populate() {
TestEntity e = new TestEntity();
Map map = new HashMap();
map.put("field1", 1);
map.put("field2", 2);
e.map = map;
ds.save(e);
}
}
对我来说,上面的代码不会产生正确的$和查询,但我不明白为什么