Запросы на основе доступных частичных данных вложенного документа (в morphia, mongoDB)

Структура документа (только для иллюстрации)

Работник

{
name : "..",
age : ..,
addresses   [
  {
     "street":"...",
     "country":{
        name:"..",
        continent:"..",
        Galaxy:".."
     }
  }
],
company:".."
}

Запрос -

У меня есть только Адреса -> улица (тип String) и Адреса -> страна -> имя (тип String). И я хочу, чтобы все сотрудники соответствовали этим критериям.

Address a1 = new Address();
a1.setStreet("bla bla");
Country c = new Country();
c.setName("sth");
a1.setCountry(c);

Query<Employee> q = ds.createQuery(Employee.class).field("addresses").hasThisElement(a1)

НЕ извлекает результаты (когда на самом деле есть реальное совпадение). Похоже, это из-за частичного совпадения документа "Страна". Если я заполню все поля страны, то получу результаты, как и ожидалось.

Вопрос № 1: Есть ли обходной путь для выше?

Вопрос № 2: Адрес - это массив, и я могу получить несколько пар (адрес # улица, страна # название), и снова мне нужен список сотрудников, которые соответствуют заданным парам. Что-то вроде:

Query<Employee> q =  ds.createQuery(Employee.class).field("addresses").hasThisElement(a1).field("addresses").hasThisElement(a2).field(..) // and so on

Примечание: я могу указать адрес разбивки, например

Address a = new Address();
a.setStreet("bla bla");
q.createQuery(Employee.class).field("addresses").hasThisElement(a).field("addresses.country.name").equal("hoo");

НО это будет соответствовать Сотруднику, где улица = "бла бла" и страна.имя!="Ху" в адресе #1 и улица!="Бла бла" и страна.имя = "ху" в адресе #2. Вы получаете смысл. Я не хочу, чтобы такие сотрудники были возвращены.

Пожалуйста, дайте мне знать, если это возможно. Большое спасибо.

1 ответ

Возможно. MongoDB имеет специальный оператор для таких ситуаций, который называется elemMatch. Морфия поддерживает это.

Вы правы в том, что второй подход является правильным (первый подход пытается найти соответствие всей стране, а не подразделу). Единственное, вы хотите ограничить его одним элементом с соответствием как улицы, так и названия страны. Не документ с соответствующей улицей и соответствующим именем страны.

На этой странице документа и в этой ветке есть дополнительная информация.

http://code.google.com/p/morphia/wiki/Query

http://groups.google.com/group/morphia/tree/browse_frm/month/2011-02/5bd3f654526fa30b?rnum=41&lnk=ol

К сожалению, я плохо знаю morphia, но, надеюсь, это даст вам достаточно информации для ее решения.

Другие вопросы по тегам