Я пытался объединить методы и ()и или ()интерфейса Query, чтобы создать набор условий, где есть 2 списка критериев, и хотя бы по одному из каждого должны быть удовлетворены.
Я читал это обсуждение и пытался использовать Query.and ()для объединения двух моих предложений $or.
По сути, я пытаюсь сказать,:
Criteria[] arrayA;
Criteria[] arrayB;
// Programatically populate both arrays
Query q = dao.createQuery().and(
q.or(arrayA),
q.or(arrayB)
);
что я использую массивы критериев, потому что мне приходится перебирать несколько разных входных данных, чтобы сгенерировать конкретные критерии, которые мне нужны, и этот подход работает, когда я просто использую один $or, но я не могу заставить Morphia сгенерировать ожидаемый запрос, когда я пытаюсь включить оба предложения $or в $and, как я объяснял выше. Я обнаружил, что запроса $and нет, а второй $or перезаписал первый, как если бы я просто дважды вызывал or ().
Например, я ожидаю, что запрос будет сгенерирован таким образом:
{
"$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,
}
}
Я не вижу много документации, но, глядя на тестовый пример, это кажется правильным способом идти об этом. Может ли кто-нибудь помочь пролить свет на то, почему это не работает, как я ожидаю?
(Этот вопрос был перекрестным -отправленным в список рассылки Morphia , так как я не уверен, какое место получит лучший ответ)
Редактировать 0:
Обновить :Повторное посещение этого, я проверил тестовый код Morphia, и все работает нормально, мне не удалось воспроизвести мою проблему в тестовом коде.
Поэтому я создал новый проект, чтобы попытаться получить работающий пример запроса, который мне нужен. Однако я столкнулся с той же проблемой, даже с тестовым проектом barebones.
Проект разработан, и POM:
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);
}
}
Для меня,приведенный выше код не создает правильный запрос $and, но я не понимаю, почему