Работа с ограничением в 16 миллионов с помощью запроса, подобного join

#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' )
        ))
    ));