#mongodb #mongodb-query #mongodb-php
#mongodb #mongodb-запрос #mongodb-php
Вопрос:
Учитывая приведенную ниже архитектуру, есть ли способ, которым я могу запросить коллекцию people на основе доступных для поиска столбцов и получить обратно объект, подобный этому?
organization with people: {
_id: "13efdsf31r23rwes"
name: "Name",
wp_slug: "/wordpress-slug/",
type: "Cemetary",
file_name: "something.csv",
columns: [
{ label: "Maiden Name", name: "maiden_name", hidden: false },
{ label: "First Name", name: "first_name", hidden: false },
{ label: "First Pet", name: "first_pet", hidden: true },
],
people: [
{
_id: "13okekdsf12313",
"organization_id": 13efdsf31r23rwes,
"maiden_name": "Gilomen",
"surname": "Black",
"first_name": "Maria",
"first_pet": "Bud the Dog",
"searchable_columns": {
"surname": ["Black", "Gilomen"],
"given": ["Maria"],
}
},
{
_id: "1231sdf1313ewfd",
"organization_id": 13efdsf31r23rwes,
"maiden_name": "Portland",
"surname": "Smith",
"first_name": "Rose",
"first_pet": "Max the Dog",
"searchable_columns": {
"surname": ["Smith", "Portland"],
"given": ["Rose"],
}
},
]
}
Текущая архитектура:
organization document example: {
_id: "13efdsf31r23rwes"
name: "Name",
wp_slug: "/wordpress-slug/",
type: "Cemetary",
file_name: "something.csv",
columns: [
{ label: "Maiden Name", name: "maiden_name", hidden: false },
{ label: "First Name", name: "first_name", hidden: false },
{ label: "First Pet", name: "first_pet", hidden: true },
],
}
people collection: [
{
_id: "13okekdsf12313",
"organization_id": 13efdsf31r23rwes,
"maiden_name": "Gilomen",
"surname": "Black",
"first_name": "Maria",
"first_pet": "Bud the Dog",
"searchable_columns": {
"surname": ["Black", "Gilomen"],
"given": ["Maria"],
}
},
{
_id: "1231sdf1313ewfd",
"organization_id": 13efdsf31r23rwes,
"maiden_name": "Portland",
"surname": "Smith",
"first_name": "Rose",
"first_pet": "Max the Dog",
"searchable_columns": {
"surname": ["Smith", "Portland"],
"given": ["Rose"],
}
},
]
К сожалению, мы достигли предела в 16 МИЛЛИОНОВ документов, когда они хранятся в виде объединенного документа, поэтому мне нужно сделать это обходное решение. Возможно ли это выполнить с помощью прямого запроса MongoDB, или нет другого способа, кроме как выполнить запрос дважды? Существует около 5 миллионов записей о людях и более чем 500 организациях. Любая помощь была бы оценена, особенно если она показана в формате MongoPHP.
Комментарии:
1. Нет способа получить документ из mongodb, размер которого превышает максимальный размер документа (не зря он называется max size). Выполните несколько запросов (или запросите несколько документов меньшего размера) и присоединитесь к приложению.
Ответ №1:
Мне удалось обойти ограничение по размеру. Используя «желаемую структуру», я разделяю предполагаемый документ на несколько документов размером менее 16 миллионов. Используя агрегированный запрос, я смог объединить все фрагменты обратно вместе.
$documents_with_results = $db->organization_data->aggregate(array(
array( '$match' => $search_column_query),
array( '$unwind' => '$p' ),
array( '$match' => $search_column_query),
array( '$group' => array(
'_id' => '$_id',
'name' => array( '$first' => '$n' ),
'slug' => array( '$first' => '$ws' ),
'people' => array( '$push' => '$p' )
))
));