У меня есть MongoDB документы с довольно сложной структурой:Область поиска в MongoDB, хочет подэлемент, а не весь документ
Top уровень организации (один элемент)
десятки атрибутов, в том числе интересно основателей и менеджеры
основатели - список учредителей, каждый из которых имеет фамилию, имя, отчество (и другие атрибуты)
То же самое с менеджеров - список элементов с ФАМИЛИЯ, имя, отчество (и другие атрибуты)
Я хочу искать в одном запросе на LastName + FirstName + отчества комбо. Запрос должен поддерживать несколько lastnames, firstnames, отчества (с помощью $ в) (это для разных названий одного человека, т.е. джон, джон, Johny)
Мой текущий код возвращает организации с Lastname + FirstName + отчества комбо внутри ORGANIZATION, но мне нужно имя + имя + патроним комбо внутри PERSON. Является ли это возможным? Был бы благодарен даже за правильное направление, а не за код. Насколько я понимаю, $ elemMatch не поможет мне, или это будет очень громоздкий запрос? Возможно, существуют более чистые варианты?
Я уже пытался изменить
List<BasicDBObject> args
для
BasicDBObject name
и заполнить его добавления. Ничего не изменилось.
Мой код:
List<BasicDBObject> args = new ArrayList<>();
args.add(new BasicDBObject("founders.typeperson.person.lastname", new BasicDBObject("$in", request.getLastnames())));
args.add(new BasicDBObject("founders.typeperson.person.firstname", new BasicDBObject("$in", request.getFirstnames())));
args.add(new BasicDBObject("founders.typeperson.person.patronym", new BasicDBObject("$in", request.getPatronyms())));
argsListUL.add(new BasicDBObject("$and", args));
result = collection.find(new BasicDBObject("$or", argsListUL)).into(new ArrayList<Document>());
На самом деле, есть гораздо больше DBObjects в окончательном argsListUL, но я удалил этот код для простоты.
update Попытка построить простой запрос в оболочке с помощью $ elemMatch. Странно, но это не работает:
db.collection.find({ "founders.typeperson.person": { $elemMatch: { "lastname": "bla" , "firstname": "bla","patronym" : "bla" } } }).pretty()
получает 0 результатов. Хотя в БД существует комбинация последнего имени + имя + патроним.
Другое примечание: база данных составляет 500 ГБ, поэтому я думаю, что $ elemMatch в проецировании будет слишком медленным.
Благодарим за ответ. Вы, как правило, правы в отношении структуры, но мой поиск не по имени организации, а по комбинации полного имени. И набор данных довольно большой, 500 ГБ: 60 млн. Организаций (каждый из которых имеет от 1 до 10000 учредителей). Сейчас я думаю - самым быстрым способом будет объединение полного имени в поле ONE. Таким образом, он будет работать быстро. –
Хорошо, так что вы хотите, чтобы искать основателей и менеджеров этих 60 миллионов организаций одновременно. Вы оштрафовали свою базу данных? –