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

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

Сотрудник

{
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 Ответ

1 голос
/ 27 марта 2012

Это возможно.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, но, надеюсь, это даст вам достаточно информации для ее решения.

...