Запросы на основе доступных частичных данных вложенного документа (в 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, но, надеюсь, это даст вам достаточно информации для ее решения.