本文是我们学院课程中名为MongoDB –可扩展NoSQL DB的一部分 。
在本课程中,您将被介绍到MongoDB。 您将学习如何安装它以及如何通过它的外壳进行操作。 此外,您还将学习如何通过Java以编程方式访问它以及如何将Map Reduce与其一起使用。 最后,将解释更高级的概念,例如分片和复制。 在这里查看 !
1.简介
在本教程的最后部分中,我们将研究MongoDB安全模型,不同类型的索引,查询计划和配置文件,服务器端游标和批量操作。
2.安全性
MongoDB安全功能包括身份验证,授权和审核。 它的基础是具有灵活权限集的基于角色的访问控制。 值得一提的是, MongoDB通过定义一组内置角色为用户定义的角色提供了基础(有关更多详细信息,请参阅官方文档 )。 与往常一样, MongoDB Shell提供了丰富的命令帮助程序集来处理安全性配置。
其他资源
- MongoDB安全性第一部分:设计和配置 http://blog.mongodb.org/post/86408399868/mongodb-security-part-1-design-and-configuration
- MongoDB安全性第二部分:可能危害数据库的10个错误 http://blog.mongodb.org/post/87691901392/mongodb-security-part-ii-10-mistakes-that-can
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提供了一个非常有用的工具来收集服务器性能数据:数据库探查器。 它收集有关正在运行的服务器实例上的查询,写入操作,游标和其他数据库命令的细粒度数据。 可以在每个数据库或每个服务器实例级别上启用分析。
要获得有关分析数据库操作性能的更多见解,请参阅官方文档 。
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 } )
将日志级别设置为1或更高时, MongoDB将记录计划缓存更改。 可以使用以下命令设置日志级别(请注意,它应该在admin数据库的上下文中运行): db.adminCommand( { setParameter: 1, logLevel: 1 } )
6.游标
游标是访问读取操作fe db.<collection>.find()
返回的文档的基本方法。 在MongoDB Shell中,如果未将返回的游标分配给变量,则仅从游标中获取前20个文档并将其显示为结果。 但是,游标非常强大,并提供了许多有用的方法。
有了对游标的更深入的了解,让我们使用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支持有序和无序批量操作。 在有序批量 操作中 ,每个操作的执行均遵循将其添加到批量操作中的顺序。 因此,在无序批量 操作中 ,不能保证每个操作的顺序。
这两个命令是开始使用批量API的起点。 他们返回批量构建器对象( Bulk类型),该对象提供了流畅的API来构建批量操作。
为了完成批量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" : [ ]
})
其他资源
- MongoDB的New Bulk API : http : //blog.mongodb.org/post/84922794768/mongodbs-new-bulk-api
8.接下来
本节总结了MongoDB教程。 希望您已经找到了适合您当前或将来应用程序需求的NoSQL文档数据库,并且本教程已帮助您做出正确的决定。