MongoDB安全性,性能分析,索引编制,游标和批量操作指南

本文是我们学院课程中名为MongoDB –可扩展NoSQL DB的一部分

在本课程中,您将被介绍到MongoDB。 您将学习如何安装它以及如何通过它的外壳进行操作。 此外,您还将学习如何通过Java以编程方式访问它以及如何将Map Reduce与其一起使用。 最后,将解释更高级的概念,例如分片和复制。 在这里查看

1.简介

在本教程的最后部分中,我们将研究MongoDB安全模型,不同类型的索引,查询计划和配置文件,服务器端游标和批量操作。

2.安全性

MongoDB安全功能包括身份验证,授权和审核。 它的基础是具有灵活权限集的基于角色的访问控制。 值得一提的是, MongoDB通过定义一组内置角色为用户定义的角色提供了基础(有关更多详细信息,请参阅官方文档 )。 与往常一样, MongoDB Shell提供了丰富的命令帮助程序集来处理安全性配置。

命令 创建用户
参量
{
    createUser: <username>,
    pwd: <password>,
    customData: { <any information> },
    roles: [
        { role: <role>, db: <database> } | <role>,
        ...
    ],
    writeConcern: { <write concern> }
}
包装纸 db.createUser(user,writeConcern)
描述 该命令在当前数据库上创建一个名为username的新用户。 如果具有这样的用户名的用户已经存在,将引发错误。
MongoDB Shell中,让我们发出命令:
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
参量
{
    updateUser: <username>,
    pwd: <password>,
    customData: { <any information> },
    roles: [
        { role: <role>, db: <database> } | <role>,
        ...
    ],
    writeConcern: { <write concern> }
}
包装纸 db.updateUser(用户名,更新,writeConcern)
描述 该命令在当前数据库上使用名称username来更新用户数据。 请注意,对属性的更新将完全替换先前的属性值(包括对用户角色的更新)。
MongoDB Shell中,让我们发出命令(以更新先前由createUser命令创建的用户):
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
参量
{
    dropUser: <username>,
    writeConcern: { <write concern> }
}
包装纸 db.dropUser(用户名,writeConcern)
描述 该命令从当前数据库中删除名称为username的用户
MongoDB Shell中,让我们发出命令(删除先前由createUser命令创建的用户):
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 Shell中,让我们发出命令(删除先前由createUser命令创建的用户): db.changeUserPassword("testuser", "newpassword")

07.DB.CHANGEUSERPASSWORD

参考 http://docs.mongodb.org/manual/reference/method/db.changeUserPassword/

db.changeUserPassword

命令 dropAllUsersFromDatabase
参量
{ 
    dropAllUsersFromDatabase: 1,
    writeConcern: { <write concern> }
}
包装纸 db.dropAllUsers(writeConcern)
描述 该命令从当前数据库中删除所有用户。 它返回一些被删除的用户。
MongoDB Shell中,让我们发出命令: db.dropAllUsers()

07.DB.DROPALLUSERS

参考 http://docs.mongodb.org/manual/reference/command/dropAllUsersFromDatabase/

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

dropAllUsersFromDatabase

命令 grantRolesToUser
参量
{ 
    grantRolesToUser: <username>,
    roles: [
        { role: <role>, db: <database> } | <role>,
        ...
    ],
    writeConcern: { <write concern> }
}
包装纸 db.grantRolesToUser(用户名,角色,writeConcern)
描述 该命令向名称为username的用户授予其他角色。
MongoDB Shell中,让我们发出命令(将角色授予由createUser命令先前创建的用户):
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
参量
{ 
    revokeRolesFromUser: <username>,
    roles: [
        { role: <role>, db: <database> } | <role>,
        ...
    ],
    writeConcern: { <write concern> }
}
包装纸 db.revokeRolesFromUser(用户名,角色,writeConcern)
描述 该命令从当前数据库上名称为username的用户中删除一个或多个角色。
MongoDB Shell中,让我们发出命令(以将角色撤销给先前由createUser命令创建的用户):
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
参量
{ 
    usersInfo: { user: <username>, db: <db> } | <name> | 1,
    showCredentials: <true|false>,
    showPrivileges: <true|false>
}
包装纸 db.getUser(用户名)

db.getUsers()

描述 该命令返回有关数据库上一个或多个用户的信息。
MongoDB Shell中,让我们发出命令(以获取有关由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
参量
{ 
    createRole: <rolename>,
    privileges: [
        { resource: { <resource> }, actions: [<action>, ... ] },
        ...
    ],
    roles: [
        { role: <role>, db: <database> } | <role>,
        ...
    ],
    writeConcern: { <write concern> }
}
包装纸 db.createRole(角色,writeConcern)
描述 该命令创建一个具有名称rolename和特定特权集的用户定义角色。 该角色将适用于当前数据库。
MongoDB Shell中,让我们发出命令:
db.createRole(
    { 
        role: "testrole",
        privileges: [
            { resource: { 
                db: "test", 
                collection: "test" 
            }, actions: [ "find" ] }
        ],
        roles: [
            { role: "read", db: "test" }
        ],
    },
    { w: "majority" , wtimeout: 5000 }
)

07.克里特勒

参考 http://docs.mongodb.org/manual/reference/command/createRole/

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

createRole

命令 updateRole
参量
{ 
    updateRole: <rolename>,
    privileges: [
        { resource: { <resource> }, actions: [<action>, ... ] },
        ...
    ],
    roles: [
        { role: <role>, db: <database> } | <role>,
        ...
    ],
    writeConcern: { <write concern> }
}
包装纸 db.updateRole(角色名称,更新,writeConcern)
描述 该命令在当前数据库上使用名称rolename更新用户定义的角色。 请注意,对属性的更新将完全替换先前的属性值(包括对角色和特权的更新)。
MongoDB Shell中,让我们发出命令(以更新先前由createRole命令创建的角色):
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
参量
{ 
    dropRole: <rolename>,
    writeConcern: { <write concern> }
}
包装纸 db.dropRole(角色名称,writeConcern)
描述 该命令从当前数据库中删除名称为rolename的用户定义角色。
MongoDB Shell中,让我们发出命令(以删除之前由createRole命令创建的角色): db.dropRole( "testrole" )

07.DROPROLE

参考 http://docs.mongodb.org/manual/reference/command/dropRole/

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

dropRole

命令 dropAllRolesFromDatabase
参量
{
    dropAllRolesFromDatabase: 1,
    writeConcern: { <write concern> }
}
包装纸 db.dropAllRoles(writeConcern)
描述 该命令从当前数据库中删除所有用户定义的角色。 它返回许多已删除的角色。
MongoDB Shell中,让我们发出命令: db.dropAllRoles()

07.DB.DROPALLROLES

参考 http://docs.mongodb.org/manual/reference/command/dropAllRolesFromDatabase/

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

dropAllRolesFromDatabase

命令 grantPrivilegesToRole
参量
{ 
    grantPrivilegesToRole: <rolename>,
    privileges: [
        { resource: { <resource> }, actions: [<action>, ... ] },
        ...
    ],
    writeConcern: { <write concern> }
}
包装纸 db.grantPrivilegesToRole(角色名称,特权,writeConcern)
描述 该命令为在当前数据库上定义的名称为rolename的用户定义角色分配其他特权。
MongoDB Shell中,让我们发出命令(向createRole命令先前创建的角色授予更多特权):
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
参量
{ 
    revokePrivilegesFromRole: <rolename>,
    privileges: [
        { resource: { <resource> }, actions: [<action>, ... ] },
        ...
    ],
    writeConcern: { <write concern> }
}
包装纸 db.revokePrivilegesFromRole(角色名称,特权,writeConcern)
描述 该命令从在当前数据库上定义的名称为rolename的用户定义角色中删除指定的特权。
MongoDB Shell中,让我们发出命令(以撤销先前由createRole命令创建的角色的特权):
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
参量
{ 
    grantRolesToRole: <rolename>,
    roles: [
        { role: <role>, db: <database> } | <role>,
        ...
    ],
    writeConcern: { <write concern> }
}
包装纸 db.grantRolesToRole(角色名称,角色,writeConcern)
描述 该命令为在当前数据库上定义的名称为rolename的用户定义角色分配其他角色。
MongoDB Shell中,让我们发出命令(将更多角色分配给createRole命令先前创建的角色):
db.grantRolesToRole(
    "testrole",
    [
        "readWrite"
    ],
    { w: "majority" , wtimeout: 5000 }
)

07.GRANTROLESTOROLE数据库

参考 http://docs.mongodb.org/manual/reference/command/grantRolesToRole/

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

grantRolesToRole

命令 revokeRolesFromRole
参量
{ 
    revokeRolesFromRole: <rolename>,
    roles: [
        { role: <role>, db: <database> } | <role>,
        ...
    ],
    writeConcern: { <write concern> }
}
包装纸 db.revokeRolesFromRole(角色名称,角色,writeConcern)
描述 从名称的用户定义的角色指定角色则取消ROLENAME当前数据库中定义。
MongoDB Shell中,让我们发出命令(从createRole命令先前创建的角色中删除一些角色):
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: <rolename> | { role: <rolename>, db: <database> },
    showPrivileges: <true|false>,
    showBuiltinRoles: <true|false>
}
包装纸 db.getRole(角色名称,showPrivileges)

db.getRoles()

描述 该命令返回指定角色(包括用户定义的角色和内置角色)的继承和特权信息。
MongoDB Shell中,让我们发出命令(以获取先前由createRole命令创建的角色的信息): db.getRole( "testrole" )

07.数据库

参考 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/

角色信息

命令 invalidateUserCache
描述 该命令立即从内存缓存中清除用户信息,包括删除每个用户的凭据和角色。
MongoDB Shell中,让我们发出命令: db.runCommand( { invalidateUserCache: 1 } )

07.INVALIDATEUSERCACHE

参考 http://docs.mongodb.org/manual/reference/command/invalidateUserCache/

invalidateUserCache

命令 认证
参量
{ 
    authenticate : 1, 
    user : <username>, 
    nonce : <nonce>, 
    key : <digest> 
}
包装纸 db.auth(用户名,密码)
描述 该命令允许用户从MongoDB Shell或客户端会话中向数据库进行身份验证。
MongoDB Shell中,让我们发出命令(以使用先前由createUser命令创建的用户来验证会话): db.auth( "testuser", "testpassword" )

07.DB授权

参考 http://docs.mongodb.org/manual/reference/command/authenticate/

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

认证

命令 登出
包装纸 db.logout()
描述 该命令终止当前已认证的会话(如果当前会话未使用认证,则该命令无效)。
MongoDB Shell中,让我们发出命令: db.logout()
07.DB.登出
参考 http://docs.mongodb.org/manual/reference/command/logout/

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

登出

其他资源

3.索引

在大多数情况下,选择正确的索引可能会提高查询性能(从而提高应用程序性能)。 MongoDB支持以下不同类型的索引:

  • _id :所有集合在_id字段上都有一个默认存在的索引
  • 单个字段 :在文档的单个字段上的索引,fe {“ title”:1}
  • 复合索引 :多个字段上的索引,fe {“ title”:1,“ price”:1}
  • multikey index :存储在数组中的内容的索引,fe {“ categories”:1}
  • 地理空间索引 :2d / 2球形索引以支持有效的地理空间查询,例如{{location“:” 2d“}
  • 文本索引 :字符串内容的索引以支持全文搜索,fe {“ title”:“ text”}
  • 哈希索引 :支持基于哈希的分片的索引(有关更多详细信息,请参阅本教程的第4部分。MongoDB Sharding Guide

此外,每个索引可以定义为:

  • unique :索引字段的重复值将被拒绝
  • 稀疏 :索引仅包含具有索引字段的文档的条目

对于索引集合,索引字段的值具有最大索引键长度限制:索引条目的总大小必须小于1024字节(请参阅官方文档的“ 限制和阈值”部分 )。

有关索引的更多详细信息,请参阅官方文档

4.分析

MongoDB提供了一个非常有用的工具来收集服务器性能数据:数据库探查器。 它收集有关正在运行的服务器实例上的查询,写入操作,游标和其他数据库命令的细粒度数据。 可以在每个数据库或每个服务器实例级别上启用分析。

命令 轮廓
参量
{
    profile: <level>
}
包装纸 db.setProfilingLevel(级别,慢速)
描述 该命令修改数据库分析系统用来捕获有关性能的数据的当前探查器级别。 level参数含义如下:

-1 –不变。 返回当前配置文件级别。

0 –关。 没有分析。

1 –开。 仅包括慢速操作。

2 –开。 包括所有操作。

MongoDB Shell中,让我们发出命令: 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 Shell中,让我们发出命令: db.getProfilingLevel()

07.DB.GETPROFILINGLEVEL

参考 http://docs.mongodb.org/manual/reference/method/db.getProfilingLevel/
命令 db.getProfilingStatus()
描述 该命令返回一个反映当前概要分析级别和概要分析阈值的文档。
MongoDB Shell中,让我们发出命令: db.getProfilingStatus()
07.DB.GETPROFILINGSTATUS
参考 http://docs.mongodb.org/manual/reference/method/db.getProfilingStatus/

db.getProfilingLevel

命令 显示个人资料
描述 输出耗时1毫秒或更长时间的五个最新操作。
MongoDB Shell中,让我们发出命令: show profile

07.SHOW.PROFILE

注意:仅显示输出的一部分。

参考 http://docs.mongodb.org/manual/reference/mongo-shell/#command-helpers

显示个人资料

要获得有关分析数据库操作性能的更多见解,请参阅官方文档

5.查询缓存

在许多其他新功能中, MongoDB 2.6支持一组新的命令来查看和操作查询缓存:

  • 列出所有已知的查询形状
  • 显示查询形状的缓存计划
  • 从缓存中删除查询形状
  • 清除整个缓存

查询优化器执行查询,并在给定已定义索引的情况下为查询选择最有效的查询计划。 稍后,每次查询(具有这种形状)都会使用此查询计划。 查询优化器仅缓存那些可能具有多个可行计划的查询形状的计划,并随着集合内容的更改偶尔重新评估查询计划。

为了试验查询计划,我们需要一个小的数据集和第3部分中的示例。MongoDB和Java教程将再次变得很方便。 让我们切换到书店数据库中的书籍收藏,创建几个索引,然后使用MongoDB Shell将一些文档插入其中。

使用书店

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 } )

命令 db。<collection> .getPlanCache()。help()
描述 该命令以简短说明显示可用于集合的查询计划缓存的方法。
MongoDB Shell中,让我们发出命令: db.books.getPlanCache().help()

07.DB.GETPLANCACHE.HELP

参考 http://docs.mongodb.org/manual/reference/method/PlanCache.help/

db。<集合> .getPlanCache

命令 planCacheListFilters
参量
{ 
    planCacheListFilters: <collection> 
}
描述 该命令列出了与集合集合的查询形状相关的索引过滤器。
MongoDB Shell中,让我们发出命令(列出之前由planCacheSetFilter设置的过滤器): db.runCommand( { planCacheListFilters: "books" } )

07.车牌过滤器

参考 http://docs.mongodb.org/manual/reference/command/planCacheListFilters/

planCacheListFilters

命令 planCacheSetFilter
参量
{
    planCacheSetFilter: <collection>,
    query: <query>,
    sort: <sort>,
    projection: <projection>,
    indexes: [ <index1>, <index2>, ...]
}
描述 该命令为集合集合设置索引过滤器。 如果查询形状已经存在索引过滤器,它将被覆盖。
MongoDB Shell中,让我们发出命令:
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
参量
{
    planCacheClearFilters: <collection>,
    query: <query>,
    sort: <sort>,
    projection: <projection>
}
描述 该命令清除集合collection的索引过滤器。
MongoDB Shell中,让我们发出命令:
db.runCommand({ 
    planCacheClearFilters: "books" ,
    query: { "publisher.name": "O'Reilly" }, 
    sort: {},
    projection: { "title": 1 }
})

07.平时检查过滤器

参考 http://docs.mongodb.org/manual/reference/command/planCacheClearFilters/

planCacheClearFilters

命令 planCacheListQueryShapes
参量
{
    planCacheListQueryShapes: <collection>
}
包装纸 db。<collection> .getPlanCache()。listQueryShapes()
描述 该命令显示存在用于集合集合的缓存查询计划的查询形状。
MongoDB Shell中,让我们发出命令: 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
参量
{
    planCacheListPlans: <collection>,
    query: <query>,
    sort: <sort>,
    projection: <projection>
}
包装纸 db。<collection> .getPlanCache()。getPlansByQuery(<query>,<projection>,<sort>)
描述 该命令显示用于集合收集的指定查询形状的缓存查询计划。
MongoDB Shell中,让我们发出命令: 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
参量
{
    planCacheClear: <collection>,
    query: <query>,
    sort: <sort>,
    projection: <projection>
}
包装纸 db。<collection> .getPlanCache()。clearPlansByQuery(<query>,<projection>,<sort>)

db。<collection> .getPlanCache()。clear()

描述 该命令清除用于集合收集的指定查询形状的缓存查询计划。 如果省略查询形状,则将清除所有缓存的查询计划。
MongoDB Shell中,让我们发出命令: db.books.getPlanCache()。clear()

07.平时检查过滤器

参考 http://docs.mongodb.org/manual/reference/command/planCacheClear/

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

planCacheClear

将日志级别设置为1或更高时, MongoDB将记录计划缓存更改。 可以使用以下命令设置日志级别(请注意,它应该在admin数据库的上下文中运行): db.adminCommand( { setParameter: 1, logLevel: 1 } )

6.游标

游标是访问读取操作fe db.<collection>.find()返回的文档的基本方法。 在MongoDB Shell中,如果未将返回的游标分配给变量,则仅从游标中获取前20个文档并将其显示为结果。 但是,游标非常强大,并提供了许多有用的方法。

方法 cursor.addOption(flag)
描述 该方法添加了特殊的有线协议标志,这些标志修改了查询的行为。
参考 http://docs.mongodb.org/manual/reference/method/cursor.addOption/

cursor.addOption(flag)

方法 cursor.batchSize(size)
描述 该方法指定从服务器实例返回的每批响应中要返回的文档数。
参考 http://docs.mongodb.org/manual/reference/method/cursor.batchSize/

cursor.batchSize(size)

方法 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(index)
描述 该方法强制服务器实例对查询使用特定的索引。
参考 http://docs.mongodb.org/manual/reference/method/cursor.hint/

cursor.hint(index)

方法 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(number)
描述 该方法返回一个游标,该游标仅在通过或跳过许多文档后才开始返回结果。 在从数据库中检索任何文档之前,应先调用它。
参考 http://docs.mongodb.org/manual/reference/method/cursor.skip/

cursor.skip(number)

方法 cursor.snapshot()
描述 该方法确保查询不会多次返回文档,即使由于文档大小的增加而导致写入操作导致文档移动。 在从数据库中检索任何文档之前,应调用它, 并且只能与未分片的集合一起使用。
参考 http://docs.mongodb.org/manual/reference/method/cursor.snapshot/

cursor.snapshot()

方法 cursor.sort(sort)
描述 该方法返回根据排序规范排序的结果。
参考 http://docs.mongodb.org/manual/reference/method/cursor.sort/

cursor.sort(sort)

方法 cursor.toArray()
描述 该方法返回一个数组,其中包含游标返回的所有文档
参考 http://docs.mongodb.org/manual/reference/method/cursor.toArray/

cursor.toArray()

命令 parallelCollectionScan
参量
{
    parallelCollectionScan: <collection>,
    numCursors: <integer>
}
描述 当从集合中读取所有文档时,该命令允许应用程序使用多个并行游标。 它返回一个包含游标信息数组的文档。
MongoDB Shell中,让我们发出命令: db.runCommand({parallelCollectionScan:“ books”,numCursors:1})

07.平行收藏扫描

参考 http://docs.mongodb.org/manual/reference/command/parallelCollectionScan/

parallelCollectionScan

有了对游标的更深入的了解,让我们使用Query Cache一节中的books集合,看看不同的游标方法在运行中的示例。

[
    {
        "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支持有序无序批量操作。 在有序批量 操作中 ,每个操作的执行均遵循将其添加到批量操作中的顺序。 因此,在无序批量 操作中 ,不能保证每个操作的顺序。

命令 db。<collection> .initializeOrderedBulkOp()
描述 该命令初始化并返回用于集合集合的新的有序批量 操作构建器。 构建器构造要批量执行的操作的有序列表。
MongoDB Shell中,让我们发出命令:
var bulk = db.testcollection.initializeOrderedBulkOp()
07.DB.INITIALIZEZEDEREDBULKOP
参考 http://docs.mongodb.org/manual/reference/method/db.collection.initializeOrderedBulkOp/

initializeOrderedBulkOp

命令 db。<collection> .initializeUnorderedBulkOp()
描述 该命令初始化并返回一个新的无序批量 操作构建器,用于收集集合 。 构建器构造要批量执行的操作的无序列表。
MongoDB Shell中,让我们发出命令:

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(<query>)。removeOne()

Bulk.find(<query>)。remove()

Bulk.find(<query>)。replaceOne()

Bulk.find(<query>)。updateOne()

Bulk.find(<query>)。update()

参考 http://docs.mongodb.org/manual/reference/method/Bulk.find/

Bulk.find(<查询>)

方法 Bulk.find(<query>)。removeOne()
描述 该方法将单个文档删除操作添加到批量操作列表中。
参考 http://docs.mongodb.org/manual/reference/method/Bulk.find.removeOne/

Bulk.find(<query>)。removeOne

方法 Bulk.find(<query>)。remove()
描述 该方法将删除操作添加到批量操作列表中。
参考 http://docs.mongodb.org/manual/reference/method/Bulk.find.remove/

Bulk.find(<query>)。删除

方法 Bulk.find(<query>)。replaceOne()
描述 该方法将单个文档替换操作添加到批量操作列表中。
参考 http://docs.mongodb.org/manual/reference/method/Bulk.find.replaceOne/

Bulk.find(<query>)。replaceOne

方法 Bulk.find(<query>)。updateOne()
描述 该方法将单个文档更新操作添加到批量操作列表中。
参考 http://docs.mongodb.org/manual/reference/method/Bulk.find.updateOne/

Bulk.find(<query>)。updateOne

方法 Bulk.find(<query>)。update()
描述 该方法将多次更新操作添加到批量操作列表中。
参考 http://docs.mongodb.org/manual/reference/method/Bulk.find.update/

Bulk.find(<查询>)。update

方法 Bulk.execute(writeConcern)
描述 该方法执行由批量操作构建器构建的操作列表。
参考 http://docs.mongodb.org/manual/reference/method/Bulk.execute/

Bulk.execute(writeConcern)

为了完成批量API,让我们使用MongoDB Shell和初始化命令创建并执行示例批量操作。 在示例中,我们将批量执行以下操作:

  • 将3本书插入图书收藏
  • 通过设置类别字段来更新所有书籍
  • 用其他类别更新书籍的类别(标题为“ MongoDB:权威指南”
  • 删除曼宁出版的所有书籍
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 Shell中执行此批量操作将产生以下结果文档:

BulkWriteResult({
    "writeErrors" : [ ],
    "writeConcernErrors" : [ ],
    "nInserted" : 3,
    "nUpserted" : 0,
    "nMatched" : 3,
    "nModified" : 3,
    "nRemoved" : 1,
    "upserted" : [ ]
})

其他资源

8.接下来

本节总结了MongoDB教程。 希望您已经找到了适合您当前或将来应用程序需求的NoSQL文档数据库,并且本教程已帮助您做出正确的决定。

翻译自: https://www.javacodegeeks.com/2015/09/mongodb-security-profiling-indexing-cursors-and-bulk-operations-guide.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值