Сложный запрос И -ИЛИ в Morphia

Я пытался объединить методы и ()и или ()интерфейса 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, но я не понимаю, почему

9
задан chrisbunney 30 April 2012 в 14:37
поделиться