Статьи

MongoDB Security, Profiling, Indexing, Cursors и Bulk Operations Guide

Эта статья является частью нашего курса Академии под названием MongoDB — A Scalable NoSQL DB .

В этом курсе вы познакомитесь с MongoDB. Вы узнаете, как установить его и как управлять им через оболочку. Кроме того, вы узнаете, как получить программный доступ к нему через Java и как использовать Map Reduce с ним. Наконец, будут объяснены более сложные понятия, такие как шардинг и репликация. Проверьте это здесь !

1. Введение

В этой заключительной части руководства мы рассмотрим модель безопасности MongoDB , различные типы индексов, планы запросов и профилирование, серверные курсоры и массовые операции.

2. Безопасность

Функции безопасности MongoDB включают аутентификацию, авторизацию и аудит. Его основой является управление доступом на основе ролей с гибким набором привилегий. Стоит отметить, что MongoDB обеспечивает основу для пользовательских ролей, определяя набор встроенных ролей (более подробную информацию см. В официальной документации ). Как всегда, оболочка MongoDB предоставляет богатый набор командных помощников для настройки безопасности.

команда Создать пользователя
параметры
01
02
03
04
05
06
07
08
09
10
{
    createUser: <username>,
    pwd: <password>,
    customData: { <any information> },
    roles: [
        { role: <role>, db: <database> } | <role>,
        ...
    ],
    writeConcern: { <write concern> }
}
обертка db.createUser (пользователь, writeConcern)
Описание Команда создает нового пользователя с именем username в текущей базе данных. Если пользователь с таким именем уже существует, возникнет ошибка.
пример В оболочке MongoDB давайте выполним команду:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
db.createUser( 
    {
        user: "testuser",
        pwd: "testpassword",
        customData: {
            "firstName": "John",
            "lastName": "Smith"
        },
        roles: [
            { role: "readWrite", db: "test" }
        ]
    }, 
    {
        w: "majority" ,
        wtimeout: 5000
    }
)

07.DB.CREATEUSER

Ссылка http://docs.mongodb.org/manual/reference/command/createUser/

http://docs.mongodb.org/manual/reference/method/db.createUser/

Создать пользователя

команда updateUser
параметры
01
02
03
04
05
06
07
08
09
10
{
    updateUser: <username>,
    pwd: <password>,
    customData: { <any information> },
    roles: [
        { role: <role>, db: <database> } | <role>,
        ...
    ],
    writeConcern: { <write concern> }
}
обертка db.updateUser (имя пользователя, обновление, writeConcern)
Описание Команда обновляет данные пользователя с именем username в текущей базе данных. Обратите внимание, что обновление свойства полностью заменяет предыдущие значения свойства (включая обновления ролей пользователя).
пример В оболочке MongoDB давайте createUser команду (чтобы обновить пользователя, созданного ранее командой createUser ):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
createUser command):
 
db.updateUser(
    "testuser"
    {
        customData: {
            "firstName": "John",
            "lastName": "Smith",
            "country": "US"
        },
        roles: [
            "read"
        ]
    }, 
    {
        w: "majority" ,
        wtimeout: 5000
    }
)

07.DB.UPDATEUSER

Ссылка http://docs.mongodb.org/manual/reference/command/updateUser/

http://docs.mongodb.org/manual/reference/method/db.updateUser/

updateUser

команда dropUser
параметры
1
2
3
4
{
    dropUser: <username>,
    writeConcern: { <write concern> }
}
обертка db.dropUser (имя пользователя, writeConcern)
Описание Команда удаляет пользователя с именем username из текущей базы данных.
пример В оболочке MongoDB , давайте createUser команду (чтобы удалить пользователя, созданного ранее командой createUser ):

1
2
3
4
5
6
7
db.dropUser(
    "testuser"
    {
        w: "majority" ,
        wtimeout: 5000
    }
)

07.DB.DROPUSER

Ссылка http://docs.mongodb.org/manual/reference/command/dropUser/

http://docs.mongodb.org/manual/reference/method/db.dropUser/

dropUser

команда db.changeUserPassword (имя пользователя, пароль)
Описание Команда обновляет пароль для существующего пользователя с именем username .
пример В оболочке MongoDB давайте createUser команду (чтобы удалить пользователя, ранее созданного командой createUser ): db.changeUserPassword("testuser", "newpassword")

07.DB.CHANGEUSERPASSWORD

Ссылка http://docs.mongodb.org/manual/reference/method/db.changeUserPassword/

db.changeUserPassword

команда dropAllUsersFromDatabase
параметры
1
2
3
4
{
    dropAllUsersFromDatabase: 1,
    writeConcern: { <write concern> }
}
обертка db.dropAllUsers (writeConcern)
Описание Команда удаляет всех пользователей из текущей базы данных. Возвращает количество удаленных пользователей.
пример В оболочке MongoDB давайте db.dropAllUsers() команду: db.dropAllUsers()

07.DB.DROPALLUSERS

Ссылка http://docs.mongodb.org/manual/reference/command/dropAllUsersFromDatabase/

http://docs.mongodb.org/manual/reference/method/db.dropAllUsers/

dropAllUsersFromDatabase

команда grantRolesToUser
параметры
1
2
3
4
5
6
7
8
{
    grantRolesToUser: <username>,
    roles: [
        { role: <role>, db: <database> } | <role>,
        ...
    ],
    writeConcern: { <write concern> }
}
обертка db.grantRolesToUser (имя пользователя, роли, writeConcern)
Описание Команда предоставляет дополнительные роли пользователю с именем username .
пример В оболочке MongoDB давайте createUser команду (для предоставления ролей пользователю, ранее созданному командой createUser ):

1
2
3
4
5
db.grantRolesToUser(
    "testuser",
    [ "read" ],
    { w: "majority" }
)

07.DB.GRANTROLESTOUSER

Ссылка http://docs.mongodb.org/manual/reference/command/grantRolesToUser/

http://docs.mongodb.org/manual/reference/method/db.grantRolesToUser/

grantRolesToUser

команда revokeRolesFromUser
параметры
1
2
3
4
5
6
7
8
{
    revokeRolesFromUser: <username>,
    roles: [
        { role: <role>, db: <database> } | <role>,
        ...
    ],
    writeConcern: { <write concern> }
}
обертка db.revokeRolesFromUser (имя пользователя, роли, writeConcern)
Описание Команда удаляет одну или несколько ролей пользователя с именем username в текущей базе данных.
пример В оболочке MongoDB давайте createUser команду (чтобы отозвать роли для пользователя, ранее созданного командой createUser ):

1
2
3
4
5
db.revokeRolesFromUser(
    "testuser",
    [ "readWrite" ],
    { w: "majority" }
)

07.DB.REVOKEROLESFROMUSER

Ссылка http://docs.mongodb.org/manual/reference/command/revokeRolesFromUser/

http://docs.mongodb.org/manual/reference/method/db.revokeRolesFromUser/

revokeRolesFromUser

команда usersInfo
параметры
1
2
3
4
5
{
    usersInfo: { user: <username>, db: <db> } | <name> | 1,
    showCredentials: <true|false>,
    showPrivileges: <true|false>
}
обертка db.getUser (имя пользователя)

db.getUsers ()

Описание Команда возвращает информацию об одном или нескольких пользователях в базе данных.
пример В оболочке MongoDB давайте createUser команду (чтобы получить информацию о пользователе, ранее созданном командой createUser ): db.getUser("testuser") (или, альтернативно, db.getUsers() )

07.DB.GETUSER

Ссылка http://docs.mongodb.org/manual/reference/command/usersInfo/

http://docs.mongodb.org/manual/reference/method/db.getUser/

http://docs.mongodb.org/manual/reference/method/db.getUsers/

usersInfo

команда createRole
параметры
01
02
03
04
05
06
07
08
09
10
11
12
{
    createRole: <rolename>,
    privileges: [
        { resource: { <resource> }, actions: [<action>, ... ] },
        ...
    ],
    roles: [
        { role: <role>, db: <database> } | <role>,
        ...
    ],
    writeConcern: { <write concern> }
}
обертка db.createRole (role, writeConcern)
Описание Команда создает пользовательскую роль с именем rolename и определенным набором привилегий. Роль будет применима к текущей базе данных.
пример В оболочке MongoDB давайте выполним команду:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
db.createRole(
    {
        role: "testrole",
        privileges: [
            { resource: {
                db: "test",
                collection: "test"
            }, actions: [ "find" ] }
        ],
        roles: [
            { role: "read", db: "test" }
        ],
    },
    { w: "majority" , wtimeout: 5000 }
)

07.DB.CREATEROLE

Ссылка http://docs.mongodb.org/manual/reference/command/createRole/

http://docs.mongodb.org/manual/reference/method/db.createRole/

createRole

команда updateRole
параметры
01
02
03
04
05
06
07
08
09
10
11
12
{
    updateRole: <rolename>,
    privileges: [
        { resource: { <resource> }, actions: [<action>, ... ] },
        ...
    ],
    roles: [
        { role: <role>, db: <database> } | <role>,
        ...
    ],
    writeConcern: { <write concern> }
}
обертка db.updateRole (rolename, update, writeConcern)
Описание Команда обновляет пользовательскую роль с именем rolename в текущей базе данных. Обратите внимание, что обновление свойства полностью заменяет предыдущие значения свойства (включая обновления ролей и привилегий).
пример В оболочке MongoDB давайте createRole команду (чтобы обновить роль, созданную ранее командой createRole ):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
db.updateRole(
    "testrole",
    {
        privileges: [
            { resource: {
                db: "test",
                collection: "test"
            }, actions: [ "find" ] }
        ],
        roles: [
            { role: "read", db: "test" },
            { role: "readWrite", db: "test" }
        ]
    },
    { w: "majority" , wtimeout: 5000 }
)

07.DB.UPDATEROLE

Ссылка http://docs.mongodb.org/manual/reference/command/updateRole/

http://docs.mongodb.org/manual/reference/method/db.updateRole/

updateRole

команда dropRole
параметры
1
2
3
4
{
    dropRole: <rolename>,
    writeConcern: { <write concern> }
}
обертка db.dropRole (rolename, writeConcern)
Описание Команда удаляет пользовательскую роль с именем rolename из текущей базы данных.
пример В оболочке MongoDB давайте createRole команду (чтобы удалить роль, созданную ранее командой createRole ): db.dropRole( "testrole" )

07.DB.DROPROLE

Ссылка http://docs.mongodb.org/manual/reference/command/dropRole/

http://docs.mongodb.org/manual/reference/method/db.dropRole/

dropRole

команда dropAllRolesFromDatabase
параметры
1
2
3
4
{
    dropAllRolesFromDatabase: 1,
    writeConcern: { <write concern> }
}
обертка db.dropAllRoles (writeConcern)
Описание Команда удаляет все пользовательские роли из текущей базы данных. Возвращает количество удаленных ролей.
пример В оболочке MongoDB давайте db.dropAllRoles() команду: db.dropAllRoles()

07.DB.DROPALLROLES

Ссылка http://docs.mongodb.org/manual/reference/command/dropAllRolesFromDatabase/

http://docs.mongodb.org/manual/reference/method/db.dropAllRoles/

dropAllRolesFromDatabase

команда grantPrivilegesToRole
параметры
1
2
3
4
5
6
7
8
{
    grantPrivilegesToRole: <rolename>,
    privileges: [
        { resource: { <resource> }, actions: [<action>, ... ] },
        ...
    ],
    writeConcern: { <write concern> }
}
обертка db.grantPrivilegesToRole (rolename, привилегии, writeConcern)
Описание Команда назначает дополнительные привилегии пользовательской роли с именем rolename, определенным в текущей базе данных.
пример В оболочке MongoDB давайте createRole команду (чтобы предоставить больше привилегий роли, созданной ранее командой createRole ):

01
02
03
04
05
06
07
08
09
10
db.grantPrivilegesToRole(
    "testrole",
    [
        { resource: {
            db: "test",
            collection: "test"
        }, actions: [ "insert" ] }
    ],
    { w: "majority" , wtimeout: 5000 }
)

07.DB.GRANTPRIVILEGESTOROLE

Ссылка http://docs.mongodb.org/manual/reference/command/grantPrivilegesToRole/

http://docs.mongodb.org/manual/reference/method/db.grantPrivilegesToRole/

grantPrivilegesToRole

команда revokePrivilegesFromRole
параметры
1
2
3
4
5
6
7
8
{
    revokePrivilegesFromRole: <rolename>,
    privileges: [
        { resource: { <resource> }, actions: [<action>, ... ] },
        ...
    ],
    writeConcern: { <write concern> }
}
обертка db.revokePrivilegesFromRole (rolename, привилегии, writeConcern)
Описание Команда удаляет указанные привилегии из определенной пользователем роли с именем rolename, определенным в текущей базе данных.
пример В оболочке MongoDB давайте createRole команду (чтобы отозвать привилегии у роли, созданной ранее командой createRole ):

01
02
03
04
05
06
07
08
09
10
db.revokePrivilegesFromRole(
    "testrole",
    [
        { resource: {
            db: "test",
            collection: "test"
        }, actions: [ "find" ] }
    ],
    { w: "majority" , wtimeout: 5000 }
)

07.DB.REVOKEPRIVILEGESFROMROLE

Ссылка http://docs.mongodb.org/manual/reference/command/revokePrivilegesFromRole/

http://docs.mongodb.org/manual/reference/method/db.revokePrivilegesFromRole/

revokePrivilegesFromRole

команда grantRolesToRole
параметры
1
2
3
4
5
6
7
8
{
    grantRolesToRole: <rolename>,
    roles: [
        { role: <role>, db: <database> } | <role>,
        ...
    ],
    writeConcern: { <write concern> }
}
обертка db.grantRolesToRole (роль, роли, writeConcern)
Описание Команда назначает дополнительные роли пользовательской роли с именем rolename, определенным в текущей базе данных.
пример В оболочке MongoDB давайте createRole команду (чтобы назначить больше ролей роли, созданной ранее командой createRole ):

1
2
3
4
5
6
7
db.grantRolesToRole(
    "testrole",
    [
        "readWrite"
    ],
    { w: "majority" , wtimeout: 5000 }
)

07.DB.GRANTROLESTOROLE

Ссылка http://docs.mongodb.org/manual/reference/command/grantRolesToRole/

http://docs.mongodb.org/manual/reference/method/db.grantRolesToRole/

grantRolesToRole

команда revokeRolesFromRole
параметры
1
2
3
4
5
6
7
8
{
    revokeRolesFromRole: <rolename>,
    roles: [
        { role: <role>, db: <database> } | <role>,
        ...
    ],
    writeConcern: { <write concern> }
}
обертка db.revokeRolesFromRole (роль, роли, writeConcern)
Описание Команда удаляет указанные роли из определенной пользователем роли с именем rolename, определенным в текущей базе данных.
пример В оболочке MongoDB давайте createRole команду (чтобы удалить некоторые роли из роли, созданной ранее командой createRole ):

1
2
3
4
5
6
7
db.revokeRolesFromRole(
    "testrole",
    [
        { role: "read", db: "test" }
    ],
    { w: "majority" , wtimeout: 5000 }
)

07.DB.REVOKEROLESFROMROLE

Ссылка http://docs.mongodb.org/manual/reference/command/revokeRolesFromRole/

http://docs.mongodb.org/manual/reference/method/db.revokeRolesFromRole/

revokeRolesFromRole

команда rolesInfo
параметры
1
2
3
4
5
{
    rolesInfo: <rolename> | { role: <rolename>, db: <database> },
    showPrivileges: <true|false>,
    showBuiltinRoles: <true|false>
}
обертка db.getRole (rolename, showPrivileges)

db.getRoles ()

Описание Команда возвращает информацию о наследовании и привилегиях для указанных ролей (включая как определяемые пользователем роли, так и встроенные роли).
пример В оболочке MongoDB давайте createRole команду (чтобы получить информацию о роли, созданной ранее командой createRole ): db.getRole( "testrole" )

07.DB.GETROLE

Ссылка http://docs.mongodb.org/manual/reference/command/rolesInfo/

http://docs.mongodb.org/manual/reference/method/db.getRole/

http://docs.mongodb.org/manual/reference/method/db.getRoles/

rolesInfo

команда invalidateUserCache
Описание Команда немедленно удаляет информацию о пользователе из кэша в памяти, включая удаление учетных данных и ролей каждого пользователя.
пример В оболочке MongoDB давайте db.runCommand( { invalidateUserCache: 1 } ) команду: db.runCommand( { invalidateUserCache: 1 } )

07.INVALIDATEUSERCACHE

Ссылка http://docs.mongodb.org/manual/reference/command/invalidateUserCache/

invalidateUserCache

команда Аутентифицировать
параметры
1
2
3
4
5
6
{
    authenticate : 1,
    user : <username>,
    nonce : <nonce>,
    key : <digest>
}
обертка db.auth (имя пользователя, пароль)
Описание Команда позволяет пользователю проходить аутентификацию в базе данных из оболочки MongoDB или сеанса клиента.
пример В оболочке MongoDB давайте createUser команду (для аутентификации сеанса с использованием пользователя, ранее созданного командой createUser ): db.auth( "testuser", "testpassword" )

07.DB.AUTH

Ссылка http://docs.mongodb.org/manual/reference/command/authenticate/

http://docs.mongodb.org/manual/reference/method/db.auth/

Аутентифицировать

команда выйти
обертка db.logout ()
Описание Команда завершает текущий сеанс аутентификации (если текущий сеанс не использует аутентификацию, команда не имеет никакого эффекта).
пример В оболочке MongoDB давайте db.logout() команду: db.logout()
07.DB.LOGOUT
Ссылка http://docs.mongodb.org/manual/reference/command/logout/

http://docs.mongodb.org/manual/reference/method/db.logout/

выйти

2.1. Дополнительные ресурсы

3. Индексирование

Выбор правильных индексов может повысить производительность ваших запросов (и, следовательно, производительность приложений) в большинстве случаев. MongoDB поддерживает различные типы индексов для выбора:

  • _id : все коллекции имеют индекс в поле _id, которое существует по умолчанию
  • одиночное поле : индексы для одного поля документа, например {title>: 1}
  • составной индекс : индексы для нескольких полей, например: {«title»: 1, «price»: 1}
  • multikey index : индексы для контента, хранящегося в массивах, например
  • геопространственный индекс : 2d / 2sphere для поддержки эффективных геопространственных запросов, например: {«location»: «2d»}
  • текстовые индексы : индексы на строковом содержимом для поддержки полнотекстового поиска, например {title ”:“ text ”}
  • хешированные индексы : индексы для поддержки хеширования на основе хеша (подробнее см. в части 4. Руководства по монтированию MongoDB )

Кроме того, каждый индекс может быть определен как:

  • уникальные : повторяющиеся значения для индексированного поля будут отклонены
  • sparse : индекс содержит записи только для документов, имеющих индексированное поле

Для индексированных коллекций значения для индексированных полей имеют максимальный предел длины ключа индекса: общий размер записи индекса должен быть не более 1024 байтов (см. Раздел официальной документации по ограничениям и порогам ).

Для получения более подробной информации об индексации, пожалуйста, обратитесь к официальной документации .

4. Профилирование

MongoDB предоставляет очень полезный инструмент для сбора данных о производительности сервера: профилировщик базы данных. Он собирает подробные данные о запросах, операциях записи, курсорах и других командах базы данных на работающем экземпляре сервера. Профилирование можно включить на уровне экземпляра для каждой базы данных или для каждого сервера.

команда Профиль
параметры
1
2
3
{
    profile: <level>
}
обертка db.setProfilingLevel (уровень, замедления)
Описание Команда изменяет текущий уровень профилировщика, используемый системой профилирования базы данных для сбора данных о производительности. Параметр level имеет следующее значение:

-1 — Без изменений. Возвращает текущий уровень профиля.

0 — выкл. Нет профилирования.

1 — вкл. Включает только медленные операции.

2 — вкл. Включает в себя все операции.

пример В оболочке MongoDB давайте db.setProfilingLevel(2) команду: db.setProfilingLevel(2)
07.SHOW.PROFILE
Ссылка http://docs.mongodb.org/manual/reference/command/profile/

http://docs.mongodb.org/manual/reference/method/db.setProfilingLevel/

Профиль

команда db.getProfilingLevel ()
Описание Команда возвращает текущий уровень профилирования для операций с базой данных.
пример В оболочке MongoDB давайте db.getProfilingLevel() команду: db.getProfilingLevel()

07.DB.GETPROFILINGLEVEL

Ссылка http://docs.mongodb.org/manual/reference/method/db.getProfilingLevel/
команда db.getProfilingStatus ()
Описание Команда возвращает документ, который отражает текущий уровень профилирования и порог профилирования.
пример В оболочке MongoDB давайте db.getProfilingStatus() команду: db.getProfilingStatus()
07.DB.GETPROFILINGSTATUS
Ссылка http://docs.mongodb.org/manual/reference/method/db.getProfilingStatus/

db.getProfilingLevel

команда показать профиль
Описание Выводит пять последних операций, которые заняли 1 миллисекунду или более.
пример В оболочке MongoDB давайте выполним команду: show profile

07.SHOW.PROFILE

Примечание. Отображается только фрагмент выходных данных.

Ссылка http://docs.mongodb.org/manual/reference/mongo-shell/#command-helpers

показать профиль

Чтобы получить больше информации об анализе производительности операций с базой данных, пожалуйста, обратитесь к официальной документации .

5. Запрос кеша

Среди многих других новых функций MongoDB 2.6 поддерживает новый набор команд для просмотра и управления кешем запросов:

  • перечислить все известные формы запроса
  • отображать кэшированные планы для формы запроса
  • удалить форму запроса из кэша
  • очистить весь кеш

Оптимизатор запросов выполняет запросы и выбирает наиболее эффективный план запроса для запроса с заданными индексами. Позднее этот план запроса используется каждый раз, когда выполняется запрос (с такой формой). Оптимизатор запросов кэширует планы только для тех форм запросов, которые могут иметь более одного жизнеспособного плана, и иногда пересматривает планы запросов по мере изменения содержимого коллекции.

Чтобы поэкспериментировать с планами запросов, нам нужен небольшой набор данных, и пример из части 3. Учебник по MongoDB и Java снова пригодится. Давайте переключимся на коллекцию книг в базе данных книжного магазина , создадим пару индексов и вставим в нее несколько документов, используя оболочку MongoDB .

использовать книжный магазин

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
db.books.ensureIndex( { "publisher.name": 1 } )
db.books.ensureIndex( { "publisher.name": 1, "price": 1 } )
 
db.books.insert( {
    "title" : "MongoDB: The Definitive Guide",
    "publisher" : { "name" : "O'Reilly" },
    "price" : 32.99
} );
 
db.books.insert( {
    "title" : "MongoDB Applied Design Patterns",
    "publisher" : { "name" : "O'Reilly" },
    "price" : 32.99
} );
 
db.books.insert( {
    "title" : "MongoDB in Action, 2nd Edition",
    "publisher" : { "name" : "Manning" },
    "price" : 26.66 
} );

Как только подготовка будет завершена, давайте запустим простой запрос, который запустит оценку планов запросов: db.books.find( { "publisher.name": "O'Reilly" }, { "title": 1 } )

команда дб. <коллекция> .getPlanCache (). помощь ()
Описание Команда отображает методы, доступные для кэша плана запросов коллекции, с кратким описанием.
пример В оболочке MongoDB давайте db.books.getPlanCache().help() команду: db.books.getPlanCache().help()

07.DB.GETPLANCACHE.HELP

Ссылка http://docs.mongodb.org/manual/reference/method/PlanCache.help/

дб. <коллекция> .getPlanCache

команда planCacheListFilters
параметры
1
2
3
{
    planCacheListFilters: <collection>
}
Описание Команда выводит список фильтров индекса, связанных с формами запроса для коллекции коллекции .
пример В оболочке MongoDB давайте planCacheSetFilter команду (чтобы planCacheSetFilter список фильтров, установленных ранее planCacheSetFilter ): db.runCommand( { planCacheListFilters: "books" } )

07.PLANCACHEGETFILTERS

Ссылка http://docs.mongodb.org/manual/reference/command/planCacheListFilters/

planCacheListFilters

команда planCacheSetFilter
параметры
1
2
3
4
5
6
7
{
    planCacheSetFilter: <collection>,
    query: <query>,
    sort: <sort>,
    projection: <projection>,
    indexes: [ <index1>, <index2>, ...]
}
Описание Команда устанавливает фильтр индекса для коллекции коллекции . Если индексный фильтр уже существует для формы запроса, он будет переопределен.
пример В оболочке MongoDB давайте выполним команду:

1
2
3
4
5
6
7
db.runCommand({
    planCacheSetFilter: "books" ,
    query: { "publisher.name": "O'Reilly" },
    sort: {},
    projection: { "title": 1 },
    indexes: [ { "publisher.name": 1 } ]
})

07.PLANCACHESETFILTER

Ссылка http://docs.mongodb.org/manual/reference/command/planCacheSetFilter/

planCacheSetFilter

команда planCacheClearFilters
параметры
1
2
3
4
5
6
{
    planCacheClearFilters: <collection>,
    query: <query>,
    sort: <sort>,
    projection: <projection>
}
Описание Команда очищает индексные фильтры для коллекции .
пример В оболочке MongoDB давайте выполним команду:

1
2
3
4
5
6
db.runCommand({
    planCacheClearFilters: "books" ,
    query: { "publisher.name": "O'Reilly" },
    sort: {},
    projection: { "title": 1 }
})

07.PLANCACHECLEARFILTERS

Ссылка http://docs.mongodb.org/manual/reference/command/planCacheClearFilters/

planCacheClearFilters

команда planCacheListQueryShapes
параметры
1
2
3
{
    planCacheListQueryShapes: <collection>
}
обертка дб. <коллекция> .getPlanCache (). listQueryShapes ()
Описание Команда отображает формы запросов, для которых существуют кэшированные планы запросов для коллекции .
пример В оболочке MongoDB давайте db.books.getPlanCache().listQueryShapes() команду: db.books.getPlanCache().listQueryShapes()

07.DB.GETPLANCACHE.LISTQUERYSHAPES

Ссылка http://docs.mongodb.org/manual/reference/command/planCacheListQueryShapes/

http://docs.mongodb.org/manual/reference/method/PlanCache.listQueryShapes/

planCacheListQueryShapes

команда planCacheListPlans
параметры
1
2
3
4
5
6
{
    planCacheListPlans: <collection>,
    query: <query>,
    sort: <sort>,
    projection: <projection>
}
обертка db. <collection> .getPlanCache (). getPlansByQuery (<запрос>, <проекция>, <сортировка>)
Описание Команда отображает кэшированные планы запросов для указанной формы запроса для сбора коллекции .
пример В оболочке MongoDB давайте db.books.getPlanCache().getPlansByQuery( { "publisher.name": "O'Reilly" }, { "title": 1 }, {} ) команду: db.books.getPlanCache().getPlansByQuery( { "publisher.name": "O'Reilly" }, { "title": 1 }, {} )

07.DB.GETPLANSBYQUERY

Примечание. Отображается только фрагмент выходных данных.

Ссылка http://docs.mongodb.org/manual/reference/command/planCacheListPlans/

http://docs.mongodb.org/manual/reference/method/PlanCache.getPlansByQuery/

planCacheListPlans

команда planCacheClear
параметры
1
2
3
4
5
6
{
    planCacheClear: <collection>,
    query: <query>,
    sort: <sort>,
    projection: <projection>
}
обертка db. <collection> .getPlanCache (). clearPlansByQuery (<запрос>, <проекция>, <сортировка>)

дб. <коллекция> .getPlanCache (). Clear ()

Описание Команда очищает кэшированные планы запросов для указанной формы запроса для сбора коллекции . Если форма запроса опущена, все кэшированные планы запросов будут очищены.
пример В оболочке MongoDB давайте выполним команду: db.books.getPlanCache (). Clear ()

07.PLANCACHECLEARFILTERS

Ссылка http://docs.mongodb.org/manual/reference/command/planCacheClear/

http://docs.mongodb.org/manual/reference/method/PlanCache.clearPlansByQuery/

planCacheClear

Если для уровня журнала установлено значение 1 или выше, MongoDB будет регистрировать изменения в кэше плана. Уровень журнала можно установить с помощью следующей команды (обратите внимание, что он должен быть запущен в контексте базы данных администратора): db.adminCommand( { setParameter: 1, logLevel: 1 } )

6. Курсоры

Курсоры — это основной способ доступа к документам, возвращаемым операциями чтения, например, db.<collection>.find() . В оболочке MongoDB , если возвращенный курсор не назначен переменной, то только первые 20 документов берутся из курсора и отображаются как результат. Тем не менее, курсоры очень мощные и предоставляют много полезных методов.

метод cursor.addOption (флаг)
Описание Метод добавляет специальные флаги протокола проводного соединения, которые изменяют поведение запроса.
Ссылка http://docs.mongodb.org/manual/reference/method/cursor.addOption/

cursor.addOption (флаг)

метод cursor.batchSize (размер)
Описание Метод указывает количество документов, возвращаемых в каждом пакете ответа от экземпляра сервера.
Ссылка http://docs.mongodb.org/manual/reference/method/cursor.batchSize/

cursor.batchSize (размер)

метод cursor.count ()
Описание Метод подсчитывает количество документов, на которые ссылается курсор.
Ссылка http://docs.mongodb.org/manual/reference/method/cursor.count/

cursor.count ()

метод cursor.explain (подробно)
Описание Метод сообщает о плане выполнения запроса (включая использование индексов) для курсора.
Ссылка http://docs.mongodb.org/manual/reference/method/cursor.explain/

cursor.explain (подробно)

метод cursor.forEach (функция)
Описание Метод перебирает курсор и применяет функцию JavaScript к каждому документу.
Ссылка http://docs.mongodb.org/manual/reference/method/cursor.forEach/

cursor.forEach (функция)

метод cursor.hasNext ()
Описание Метод возвращает true, если у курсора больше документов и его можно повторять.
Ссылка http://docs.mongodb.org/manual/reference/method/cursor.hasNext/

cursor.hasNext ()

метод cursor.hint (индекс)
Описание Метод заставляет экземпляр сервера использовать определенный индекс для запроса.
Ссылка http://docs.mongodb.org/manual/reference/method/cursor.hint/

cursor.hint (индекс)

метод cursor.limit (предел)
Описание Метод ограничивает размер результирующего набора курсора (возвращаемых документов).
Ссылка http://docs.mongodb.org/manual/reference/method/cursor.limit/

cursor.limit (предел)

метод cursor.map (функция)
Описание Метод применяет функцию JavaScript к каждому документу в курсоре и собирает возвращаемые значения в массив.
Ссылка http://docs.mongodb.org/manual/reference/method/cursor.map/

cursor.map (функция)

метод cursor.maxTimeMS (<миллисекунды>)
Описание Метод задает совокупный лимит времени в миллисекундах для обработки операций на курсоре.
Ссылка http://docs.mongodb.org/manual/reference/method/cursor.maxTimeMS/

cursor.maxTimeMS (<миллисекунды>)

метод cursor.max ({field1: <max value1>, field2: <max value2>… fieldN: <max valueN>})
Описание Метод определяет исключительный верхний индекс, связанный с курсором.
Ссылка http://docs.mongodb.org/manual/reference/method/cursor.max/

cursor.max

метод cursor.min ({field1: <min value1>, field2: <min value2>… fieldN: <min valueN>})
Описание Метод определяет нижнюю границу индекса для курсора.
Ссылка http://docs.mongodb.org/manual/reference/method/cursor.min/

cursor.min

метод cursor.next ()
Описание Метод возвращает следующий документ в курсоре.
Ссылка http://docs.mongodb.org/manual/reference/method/cursor.next/

cursor.next ()

метод cursor.objsLeftInBatch ()
Описание Метод возвращает количество документов, оставшихся в текущем пакете курсора.
Ссылка http://docs.mongodb.org/manual/reference/method/cursor.objsLeftInBatch/

cursor.objsLeftInBatch ()

метод cursor.readPref (mode, tagSet)
Описание Метод задает предпочтение чтения для курсора, чтобы управлять тем, как клиенты направляют запросы в набор реплик .
Ссылка http://docs.mongodb.org/manual/reference/method/cursor.readPref/

cursor.readPref (mode, tagSet)

метод cursor.showDiskLoc ()
Описание Метод возвращает курсор с измененными документами, которые включают местоположение документа на диске в специальном свойстве $ diskLoc .
Ссылка http://docs.mongodb.org/manual/reference/method/cursor.showDiskLoc/

cursor.showDiskLoc ()

метод cursor.size ()
Описание Метод возвращает количество документов в курсоре после применения методов cursor.skip () и cursor.limit () .
Ссылка http://docs.mongodb.org/manual/reference/method/cursor.size/

cursor.size ()

метод cursor.skip (номер)
Описание Метод возвращает курсор, который начинает возвращать результаты только после передачи или пропуска нескольких документов. Его следует вызывать перед извлечением любых документов из базы данных.
Ссылка http://docs.mongodb.org/manual/reference/method/cursor.skip/

cursor.skip (номер)

метод cursor.snapshot ()
Описание Этот метод гарантирует, что запрос не будет возвращать документ несколько раз, даже если промежуточные операции записи приводят к перемещению документа из-за увеличения размера документа. Он должен вызываться перед извлечением каких-либо документов из базы данных и работает только с незащищенными коллекциями.
Ссылка http://docs.mongodb.org/manual/reference/method/cursor.snapshot/

cursor.snapshot ()

метод cursor.sort (сортировка)
Описание Метод возвращает результаты, упорядоченные в соответствии со спецификацией сортировки.
Ссылка http://docs.mongodb.org/manual/reference/method/cursor.sort/

cursor.sort (сортировка)

метод cursor.toArray ()
Описание Метод возвращает массив, содержащий все документы, возвращаемые курсором
Ссылка http://docs.mongodb.org/manual/reference/method/cursor.toArray/

cursor.toArray ()

команда parallelCollectionScan
параметры
1
2
3
4
{
    parallelCollectionScan: <collection>,
    numCursors: <integer>
}
Описание Команда позволяет приложениям использовать несколько параллельных курсоров при чтении всех документов из коллекции. Возвращает документ, который содержит массив информации о курсоре.
пример В оболочке MongoDB давайте выполним команду: db.runCommand ({parallelCollectionScan: «books», numCursors: 1})

07.PARALLELCOLLECTIONSCAN

Ссылка http://docs.mongodb.org/manual/reference/command/parallelCollectionScan/

parallelCollectionScan

Вооружившись более глубокими знаниями о курсорах, давайте рассмотрим пример различных методов курсора в действии, используя коллекцию книг из раздела Query Cache .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[
    {
        "title" : "MongoDB in Action, 2nd Edition",
        "publisher" : {
            "name" : "Manning"
        },
        "price" : 26.66,
        "$diskLoc" : {
            "file" : 0,
            "offset" : 17072
        }
    },
    {
        "title" : "MongoDB: The Definitive Guide",
        "publisher" : {
            "name" : "O'Reilly"
        },
        "price" : 32.99,
        "$diskLoc" : {
            "file" : 0,
            "offset" : 16560
        }
    }
]

7. Массовые операции

Одной из самых крутых возможностей последней версии MongoDB 2.6 является введение массового API . В двух словах, этот новый API поддерживает упорядоченные и неупорядоченные массовые операции. В упорядоченной групповой операции выполнение каждой операции следует порядку, который был добавлен к групповой операции. Следовательно, в неупорядоченной массовой операции порядок каждой операции не гарантируется.

команда дб. <коллекция> .initializeOrderedBulkOp ()
Описание Команда Инициализирует и возвращает новый упорядоченный построитель массовых операций для коллекции . Строитель создает упорядоченный список операций, которые должны быть выполнены массово.
пример В оболочке MongoDB давайте выполним команду:
var bulk = db.testcollection.initializeOrderedBulkOp ()
07.DB.INITIALIZEORDEREDBULKOP
Ссылка http://docs.mongodb.org/manual/reference/method/db.collection.initializeOrderedBulkOp/

initializeOrderedBulkOp

команда дб. <коллекция> .initializeUnorderedBulkOp ()
Описание Команда инициализирует и возвращает новый неупорядоченный построитель массовых операций для коллекции . Построитель создает неупорядоченный список операций, которые должны быть выполнены массово.
пример В оболочке MongoDB давайте выполним команду:

var bulk = db.testcollection.initializeUnorderedBulkOp ()

Ссылка http://docs.mongodb.org/manual/reference/method/db.collection.initializeUnorderedBulkOp/

initializeUnorderedBulkOp

Эти две команды являются отправной точкой для начала использования массового API. Они возвращают объект массового построения (типа Bulk ), который обеспечивает свободный API для создания массовых операций.

метод Bulk.insert (<документ>)
Описание Метод добавляет операцию вставки в список массовых операций.
Ссылка http://docs.mongodb.org/manual/reference/method/Bulk.insert/

Bulk.insert (<документ>)

метод Bulk.find (<запрос>)
Описание Метод задает условие запроса для обновления или операции удаления. Может использоваться со следующими массовыми операциями:

Bulk.find (<запрос>). RemoveOne ()

Bulk.find (<запрос>). Remove ()

Bulk.find (<запрос>). ReplaceOne ()

Bulk.find (<запрос>). UpdateOne ()

Bulk.find (<запрос>). Update ()

Ссылка http://docs.mongodb.org/manual/reference/method/Bulk.find/

Bulk.find (<запрос>)

метод Bulk.find (<запрос>). RemoveOne ()
Описание Метод добавляет одну операцию удаления документа в список массовых операций.
Ссылка http://docs.mongodb.org/manual/reference/method/Bulk.find.removeOne/

Bulk.find (<запрос>). RemoveOne

метод Bulk.find (<запрос>). Удалить ()
Описание Метод добавляет операцию удаления в список массовых операций.
Ссылка http://docs.mongodb.org/manual/reference/method/Bulk.find.remove/

Bulk.find (<запрос>). Удалить

метод Bulk.find (<запрос>). ReplaceOne ()
Описание Метод добавляет одну операцию замены документа в список массовых операций.
Ссылка http://docs.mongodb.org/manual/reference/method/Bulk.find.replaceOne/

Bulk.find (<запрос>). ReplaceOne

метод Bulk.find (<запрос>). UpdateOne ()
Описание Метод добавляет одну операцию обновления документа в список массовых операций.
Ссылка http://docs.mongodb.org/manual/reference/method/Bulk.find.updateOne/

Bulk.find (<запрос>). UpdateOne

метод Bulk.find (<запрос>). Обновление ()
Описание Метод добавляет операцию множественного обновления в список массовых операций.
Ссылка http://docs.mongodb.org/manual/reference/method/Bulk.find.update/

Bulk.find (<запрос>). Обновление

метод Bulk.execute (writeConcern)
Описание Метод выполняет список операций, созданных сборщиком массовых операций.
Ссылка http://docs.mongodb.org/manual/reference/method/Bulk.execute/

Bulk.execute (writeConcern)

Чтобы закончить с массовым API, давайте создадим и выполним пример массовой операции, используя оболочку MongoDB и команды инициализации. В примере мы собираемся выполнить следующие действия:

  • вставить 3 книги в коллекцию книг
  • обновить все книги , установив поле категорий
  • обновить категории книги (под названием «MongoDB: The Definition Guide» ) с дополнительной категорией
  • удалить все книги, опубликованные Мэннингом
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var bulk = db.books.initializeOrderedBulkOp();
bulk.insert( {
    "title" : "MongoDB: The Definitive Guide",
    "publisher" : { "name" : "O'Reilly" },
    "price" : 32.99
} );
bulk.insert( {
    "title" : "MongoDB Applied Design Patterns",
    "publisher" : { "name" : "O'Reilly" },
    "price" : 32.99
} );
bulk.insert( {
    "title" : "MongoDB in Action, 2nd Edition",
    "publisher" : { "name" : "Manning" },
    "price" : 26.66 
} );
bulk.find( { "publisher.name": "O'Reilly" } )
    .update( { $set: { "categories" : [ "Databases", "NoSQL" ] } } );
bulk.find( { "title": "MongoDB: The Definitive Guide" } )
    .updateOne( { $addToSet: { "categories" : "Programming" } } );
bulk.find( { "publisher.name": "Manning" } )
    .remove();
bulk.execute( { w: "majority" ,  wtimeout: 5000  } );

Как вы можете видеть, каждое действие в рамках упорядоченной массовой операции может зависеть от предыдущих действий (например, поиск / обновление зависит от вставки). Это не относится к неупорядоченным массовым операциям . Выполнение этой массовой операции в оболочке MongoDB приводит к следующему результату:

01
02
03
04
05
06
07
08
09
10
BulkWriteResult({
    "writeErrors" : [ ],
    "writeConcernErrors" : [ ],
    "nInserted" : 3,
    "nUpserted" : 0,
    "nMatched" : 3,
    "nModified" : 3,
    "nRemoved" : 1,
    "upserted" : [ ]
})

7.1. Дополнительные ресурсы

8. Что дальше

Этот раздел завершает учебник по MongoDB . Надеемся, что вы нашли эту базу данных документов NoSQL, соответствующую вашим текущим или будущим требованиям приложений, и это руководство помогло вам принять правильные решения.