• [技术干货] 细说mongodb索引
        索引是提高查询查询效率最有效的手段。索引是一种特殊的数据结构,索引以易于遍历的形式存储了数据的部分内容(如:一个特定的字段或一组字段值),索引会按一定规则对存储值进行排序,而且索引的存储位置在内存中,所在从索引中检索数据会非常快。如果没有索引,MongoDB必须扫描集合中的每一个文档,这种扫描的效率非常低,尤其是在数据量较大时。一 、B-树索引         B-树索引是MongoDB的默认索引结构。以下是B-树索引结构高等级的概述。    B-树索引具有分层树结构。树顶部是头部块。此块包含指向任何给定范围的键值的适当分支块的指针。分支块通常会指向适当的叶子块以获得更具体的范围,或者对于更大的索引,则指向另一个分支块。 叶子块包含一个键值列表和指向磁盘上文档位置的指针。    查看上面的图,让我们想象一下MongoDB如何遍历这个索引。 如果我们需要访问“BAKER”的记录,我们首先会查阅头部块。 头部块会告诉我们,从A到K开始的键值存储在最左边的分支块中。 访问这个分支块,我们发现从A到D开始的键值存储在最左边的叶子块中。 咨询这个叶子块,我们发现值“BAKER”以及它关联的磁盘位置,我们将用它来获得有关的文件。叶子块包含前一个和后一个叶子块的链接。 这允许我们以升序或降序扫描索引,并且允许使用$gt或$lt操作符的范围查询使用索引进行处理。    与其他索引策略相比,B-树索引具有以下优点:(1)由于每个叶子节点处于相同的深度,所以性能是非常可预测的。 从理论上讲,集合中的任何文档都不会超过三或四次I/O。(2)B树为大型集合提供了良好的性能,因为深度最多为四个(一个头部块,两个分支块级别和一个叶子块级别)。 一般来说,没有任何文件需要四个以上的I/O来定位。 实际上,因为头部块几乎总是已经加载到内存中,而分支块通常加载到内存中,所以实际的物理磁盘读取次数通常只有一次或两次。(3)因为与前一个和后一个叶子块的链接,所以B-树索引支持范围查询以及精确的查找是可行的。    B-树索引提供了灵活高效的查询性能。但是,在更改数据时维护B-树可能很昂贵。例如,考虑在上面的图表中**一个键值为“NIVEN”的文档。要**集合,我们必须在“L-O”块中添加一个新条目。如果在这个区域内有空闲空间,那么成本是很大的,但也许不会过多。但是如果块中没有可用空间会发生什么?如果叶子块中没有空闲空间用于新条目,则需要索引拆分。必须分配新块,并将现有块中的一半条目移入新块。除此之外,还需要在分支块中添加一个新条目(以便指向新创建的叶子块)。如果分支块中没有空闲空间,则分支块也必须分割。这些索引拆分是一项昂贵的操作:必须分配新块,并将索引条目从一个块移到另一个块。二、创建/重建索引MongoDB全新创建索引使用ensureIndex()方法,对于已存在的索引可以使用reIndex()进行重建。MongoDB创建索引使用ensureIndex()方法。语法结构:db.COLLECTION_NAME.ensureIndex(keys[,options])keys,要建立索引的参数列表。如:{KEY:1},其中key表示字段名,1表示升序排序,也可使用使用数字-1降序。options,可选参数,表示建立索引的设置。可选值如下:background,Boolean,在后台建立索引,以便建立索引时不阻止其他数据库活动。默认值 false。unique,Boolean,创建唯一索引。默认值 false。name,String,指定索引的名称。如果未指定,MongoDB会生成一个索引字段的名称和排序顺序串联。dropDups,Boolean,创建唯一索引时,如果出现重复删除后续出现的相同索引,只保留第一个。sparse,Boolean,对文档中不存在的字段数据不启用索引。默认值是 false。v,index version,索引的版本号。weights,document,索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。如,为集合sites建立索引> db.sites.ensureIndex({name: 1, domain: -1}) {   "createdCollectionAutomatically" : false,   "numIndexesBefore" : 1,   "numIndexesAfter" : 2,   "ok" : 1 }重建索引reIndex()db.COLLECTION_NAME.reIndex()如,重建集合sites的所有索引:> db.sites.reIndex() {   "nIndexesWas" : 2,   "nIndexes" : 2,   "indexes" : [     {   "key" : { "_id" : 1   },   "name" : "_id_", "ns" : "newDB.sites" }, {   "key" : { "name" : 1, "domain" : -1   },   "name" : "name_1_domain_-1",   "ns" : "newDB.sites" }   ],   "ok" : 1 }三、创建/重建索引    MongoDB提供了查看索引信息的方法:getIndexes()方法可以用来查看集合的所有索引,totalIndexSize()查看集合索引的总大小,db.system.indexes.find()查看数据库中所有索引信息。查看集合中的索引getIndexes()db.COLLECTION_NAME.getIndexes()如,查看集合sites中的索引:>db.sites.getIndexes() [   { "v" : 1, "key" : {   "_id" : 1 }, "name" : "_id_", "ns" : "newDB.sites"   },   { "v" : 1, "key" : {   "name" : 1,   "domain" : -1 }, "name" : "name_1_domain_-1", "ns" : "newDB.sites"   } ]查看集合中的索引大小totalIndexSize()db.COLLECTION_NAME.totalIndexSize()如,查看集合sites索引大小:> db.sites.totalIndexSize() 16352 查看数据库中所有索引db.system.indexes.find()db.system.indexes.find()四、创建/重建索引不在需要的索引,我们可以将其删除。删除索引时,可以删除集合中的某一索引,可以删除全部索引。删除指定的索引dropIndex()db.COLLECTION_NAME.dropIndex("INDEX-NAME")如,删除集合sites中名为"name_1_domain_-1"的索引:> db.sites.dropIndex("name_1_domain_-1") { "nIndexesWas" : 2, "ok" : 1 }删除所有索引dropIndexes()db.COLLECTION_NAME.dropIndexes()如,删除集合sites中所有的索引:> db.sites.dropIndexes() {   "nIndexesWas" : 1,   "msg" : "non-_id indexes dropped for collection",   "ok" : 1 }
  • mongodb几种备份恢复方式比较
    总览[hr]MongoDB server 提供了两种备份恢复的方法:一种是通过拷贝底层数据文件进行备份(这种方法又细化为两个不同的操作模式:1.文件快照 2.cp or rsync 等类似的文件传输复制工具)。第二种是通过mongodb 的备份恢复工具mongodump,mongorestore进行对应的备份恢复操作。两种方法有各种的优缺点和适应的应用场景,下面详细进行对比分析。1.通过文件快照(Filesystem Snapshots)进行备份和恢复[hr]概述 文件快照备份依赖mongodb宿主机器的操作系统(linux 的LVM特性),它使用操作系统级别的工具对mongodb数据文件所在的设备进行拷贝备份,由于这种方法使用的是操作系统级别的工具,因此拷贝备份效率高并且可靠性也高,同时也决定了它的一个缺点:需要宿主环境的支持。操作步骤(linux LVM) · 创建快照:lvcreate --size 100M --snapshot --name mdb-snap01 /dev/vg0/mongodb· 归档快照:umount/dev/vg0/mdb-snap01; dd if=/dev/vg0/mdb-snap01 | gzip > mdb-snap01.gz· 恢复快照:lvcreate--size 1G --name mdb-new vg0;gzip -d -c mdb-snap01.gz | ddof=/dev/vg0/mdb-new;mount /dev/vg0/mdb-new /srv/mongodb操作步骤(未开启日志功能或日志文件和数据文件不在同一个卷) · 刷新写操作到硬盘并锁住数据库:db.fsyncLock()· 创建快照· 快照完成后,解锁数据库:db.fsyncUnlock()优点 · 支持时间点的快照备份(point-in-time snapshots)· 更高的效率和可靠性· 在满足一定条件下能够获取分片集群的一致性快照备份· 提供增量备份缺点 · 需要文件系统支持时间点快照(linux:the Logical Volume Manager LVM)· 需要开启日志功能(journalingenabled)并且日志文件和数据文件位于同一个文件卷上(3.2 WiredTiger 数据文件和日志文件可以位于不同的文件卷),否则无法保证快照有效性和一致性· 为获取分片集群的一致快照,需要关闭集群均衡器并在大致相同的时刻从集群的每个分片和配置服务器上抓取快照· 没有开启日志功能时,备份前需要将写落地硬盘,备份中停止任何写操作(MMAPv1)· MMAPv1通过日志功能在快照时无需停止写达到一致状态, WiredTiger通过thelast checkpoint 达到一致状态(Checkpoints 每2G数据或每分钟)· 快照创建整个磁盘的镜像,因此将数据文件,配置,日志放在一个逻辑磁盘上节约空间版本特性 · MongoDB 3.2以上的WiredTiger引擎支持卷级备份,也就是说日志文件(journal files)和数据文件位于不同的磁盘卷上,而3.2以前版本的WiredTiger引擎如果要支持卷级备份,日志文件和数据文件必须在同一个卷上(只要开启日志就无需刷新硬盘并停写进行备份)2.通过cp 或rsync 备份和恢复[hr]概述 利用cp 或者rsync 等类似的文件复制同步工具对mongodb 的数据库文件进行拷贝备份优点 · 无需文件系统支持快照功能缺点 · 备份拷贝前必须停止所有的对mongod的写操作,否则将是一个无效的备份· 不支持副本集时间点级(point in time recovery)恢复,并且很难管理大型分片集群· 备份文件占有更多的空间(包括索引以及重复的底层文件填充和碎片)操作步骤 · 执行对应的文件传输工具命令直接拷贝数据文件3.通过mongodump/mongorestore工具进行备份和恢复[hr]概述 在运行的mongod程序上,mongodump从MongoDB数据库中读取数据生产一个高质量的BSON格式文件,mongorestore则可以将其还原为MongoDB数据库。优点 · 备份恢复小型mongoDB集群更简单和效率,备份文件占有的空间更少(只备份文档,不备份索引)· 备份过程中应用可以继续修改数据(记录oplog,通过--oplog选项达到数据状态一致)缺点 · 备份的数据库中不包含local数据库,只备份数据库的文档不备份数据库索引,因此恢复后必须重建索引· 备份恢复大型mogoDB集群不理想(效率不高)· 备份时会影响运行中的mongod的性能(产生网络流量)· 备份的数据比系统内存大时,查询操作会引起页错误· 必须拥有对应的访问控制权限(执行find操作的权限,内建的backup角色拥有备份的权限)· mongodump不同版本的格式不能兼容,不要使用新版本的mongodump备份老版本的数据操作步骤 · 备份:mongodump--host mongodb.example.net --port 27017 --collection myCollection --db test--out /data/backup/(会覆盖备份目录中的文件)· 恢复:mongorestore--port --oplogReplay4.总结 Snapshot备份时由于是对整个磁盘卷进行快照,为了减少不必要的数据的备份,需要预先将mongodb的数据,日志等放在一个单独的磁盘卷上。而mongodump备份时只备份数据文档,不备份索引,恢复后需要重建。但mongodump可以备份指定的数据库和集合,备份数据更灵活些,但备份的时候会对运行的mongodb产生性能影响。两者对分片集群备份,要产生同一时间点的一致备份,都需要在备份期间停止应用程序对mongodb的写操作,否则两者对分片集群的备份只能达到近似的同一时间点备份(approximately the same moment in time)。 两者在做恢复的时候都需要对集群进行一段时间的停机操作维护。 来源: mongodb几种备份恢复方式比较
  • [技术干货] Python操作MongoDB看这一篇就够了
    。一般来说,传入MongoDB的IP及端口即可,其中第一个参数为地址,第二个参数为端口(如果不给它传递参数,默认是27017): pymongoclient = pymongo.MongoClient(host=, port=)的第一个参数还可以直接传入MongoDB的连接字符串,它以开头,例如:的属性即可返回test数据库。当然,我们也可以这样指定:对象。    : ,    : ,    : ,    : }的方法即可**数据,代码如下:print(result)属性来唯一标识。如果没有显式指明该属性,MongoDB会自动产生一个类型的属性。方法会在执行后返回值。    : ,    : ,    : ,    : }student2 = {    : ,    : ,    : ,    : }result = collection.insert([student1, student2])print(result)的集合:方法了。当然,继续使用也没有什么问题。官方推荐使用和方法来分别**单条记录和多条记录,示例如下:    : ,    : ,    : ,    : }result = collection.insert_one(student)print(result)print(result.inserted_id)>ab0f15c2606f0c1cf6c5方法不同,这次返回的是对象,我们可以调用其属性获取。方法,我们可以将数据以列表形式传递,示例如下:    : ,    : ,    : ,    : }student2 = {    : ,    : ,    : ,    : }result = collection.insert_many([student1, student2])print(result)print(result.inserted_ids)>[ObjectId(), ObjectId()],调用属性可以获取**数据的列表。或方法进行查询,其中查询得到的是单个结果,则返回一个生成器对象。示例如下:: })print(type(result))print(result)为的数据,它的返回结果是字典类型,运行结果如下:{'_id': ObjectId('5932a80115c2606a59e8a049'), 'id': '20170202', 'name': 'Mike', 'age': 21, 'gender': 'male'}属性,这就是MongoDB在**过程中自动添加的。来查询,此时需要使用bson库里面的: bson.objectid ObjectIdresult = collection.find_one({: ObjectId()})print(result)。方法。例如,这里查找年龄为20的数据,示例如下:: })print(results) result results:    print(result)>{: ObjectId(), : , : , : , : }{: ObjectId(), : , : , : , : }{: ObjectId(), : , : , : , : }类型,它相当于一个生成器,我们需要遍历取到所有的结果,其中每个结果都是字典类型。,意思是大于,键值为20。来指定正则匹配,代表以M开头的正则表达式。以M开头属性存在的类型为类型的属性中包含字符串https://docs.mongodb.com/manual/reference/operator/query/。方法。比如,统计所有数据条数:print(count): }).count()print(count)方法,并在其中传入排序的字段及升降序标志即可。示例如下:, pymongo.ASCENDING)print([result[] result results])指定升序。如果要降序排列,可以传入。方法偏移几个位置,比如偏移2,就忽略前两个元素,得到第三个及以后的元素:, pymongo.ASCENDING).skip()print([result[] result results])方法指定要取的结果个数,示例如下:, pymongo.ASCENDING).skip().limit()print([result[] result results])方法,原本会返回三个结果,加了限制后,会截取两个结果返回。 bson.objectid ObjectIdcollection.find({: {: ObjectId()}})。方法,指定更新的条件和更新后的数据即可。例如:: }student = collection.find_one(condition)student[] = result = collection.update(condition, student)print(result)为的数据的年龄:首先指定查询条件,然后将数据查询出来,修改年龄后调用方法将原条件和修改后的数据传入。代表执行成功,代表影响的数据条数。操作符对数据进行更新,代码如下:字典内存在的字段。如果原先还有其他字段,则不会更新,也不会删除。而如果不用的话,则会把之前的数据全部用字典替换;如果原本存在其他字段,则会被删除。方法其实也是官方不推荐使用的方法。这里也分为方法和方法,用法更加严格,它们的第二个参数需要使用类型操作符作为字典的键名,示例如下:: }student = collection.find_one(condition)student[] = result = collection.update_one(condition, {: student})print(result)print(result.matched_count, result.modified_count)方法,第二个参数不能再直接传入修改后的字典,而是需要使用这样的形式,其返回结果是类型。然后分别调用和属性,可以获得匹配的数据条数和影响的数据条数。> : {: }}result = collection.update_one(condition, {: {: }})print(result)print(result.matched_count, result.modified_count),也就是年龄加1,执行之后会将第一条符合条件的数据年龄加1。> 方法,则会将所有符合条件的数据都更新,示例如下:: {: }}result = collection.update_many(condition, {: {: }})print(result)print(result.matched_count, result.modified_count)> 方法指定删除的条件即可,此时符合条件的所有数据均会被删除。示例如下:: })print(result)和。示例如下:: })print(result)print(result.deleted_count)result = collection.delete_many({: {: }})print(result.deleted_count)>即删除第一条符合条件的数据,即删除所有符合条件的数据。它们的返回结果都是类型,可以调用属性获取删除的数据条数。、和,它们是查找后删除、替换和更新操作,其用法与上述方法基本一致。、和等。api.mongodb.com/python/current/api/pymongo/collection.html。api.mongodb.com/python/current/api/pymongo/。来源: Python操作MongoDB看这一篇就够了
  • Python操作MongoDB看这一篇就够了
    MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,它的字段值可以包含其他文档、数组及文档数组,非常灵活。在这一节中,我们就来看看Python 3下MongoDB的存储操作。1. 准备工作在开始之前,请确保已经安装好了MongoDB并启动了其服务,并且安装好了Python的PyMongo库。2. 连接MongoDB连接MongoDB时,我们需要使用PyMongo库里面的MongoClient。一般来说,传入MongoDB的IP及端口即可,其中第一个参数为地址host,第二个参数为端口port(如果不给它传递参数,默认是27017):import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)这样就可以创建MongoDB的连接对象了。另外,MongoClient的第一个参数host还可以直接传入MongoDB的连接字符串,它以mongodb开头,例如:client = MongoClient('mongodb://localhost:27017/')这也可以达到同样的连接效果。3. 指定数据库MongoDB中可以建立多个数据库,接下来我们需要指定操作哪个数据库。这里我们以test数据库为例来说明,下一步需要在程序中指定要使用的数据库:db = client.test这里调用client的test属性即可返回test数据库。当然,我们也可以这样指定:db = client['test']这两种方式是等价的。4. 指定集合MongoDB的每个数据库又包含许多集合(collection),它们类似于关系型数据库中的表。下一步需要指定要操作的集合,这里指定一个集合名称为students。与指定数据库类似,指定集合也有两种方式:collection = db.studentscollection = db['students']这样我们便声明了一个Collection对象。5. **数据接下来,便可以**数据了。对于students这个集合,新建一条学生数据,这条数据以字典形式表示:student = {    'id': '20170101',    'name': 'Jordan',    'age': 20,    'gender': 'male'}这里指定了学生的学号、姓名、年龄和性别。接下来,直接调用collection的insert()方法即可**数据,代码如下:result = collection.insert(student) print(result)在MongoDB中,每条数据其实都有一个_id属性来唯一标识。如果没有显式指明该属性,MongoDB会自动产生一个ObjectId类型的_id属性。insert()方法会在执行后返回_id值。运行结果如下:5932a68615c2606814c91f3d当然,我们也可以同时**多条数据,只需要以列表形式传递即可,示例如下:student1 = {    'id': '20170101',    'name': 'Jordan',    'age': 20,    'gender': 'male'}student2 = {    'id': '20170202',    'name': 'Mike',    'age': 21,    'gender': 'male'}result = collection.insert([student1, student2])print(result)返回结果是对应的_id的集合:[ObjectId('5932a80115c2606a59e8a048'), ObjectId('5932a80115c2606a59e8a049')]实际上,在PyMongo 3.x版本中,官方已经不推荐使用insert()方法了。当然,继续使用也没有什么问题。官方推荐使用insert_one()和insert_many()方法来分别**单条记录和多条记录,示例如下:student = {    'id': '20170101',    'name': 'Jordan',    'age': 20,    'gender': 'male'}result = collection.insert_one(student)print(result)print(result.inserted_id)运行结果如下:<pymongo.results.InsertOneResult object at 0x10d68b558>5932ab0f15c2606f0c1cf6c5与insert()方法不同,这次返回的是InsertOneResult对象,我们可以调用其inserted_id属性获取_id。对于insert_many()方法,我们可以将数据以列表形式传递,示例如下:student1 = {    'id': '20170101',    'name': 'Jordan',    'age': 20,    'gender': 'male'}student2 = {    'id': '20170202',    'name': 'Mike',    'age': 21,    'gender': 'male'}result = collection.insert_many([student1, student2])print(result)print(result.inserted_ids)运行结果如下:<pymongo.results.InsertManyResult object at 0x101dea558>[ObjectId('5932abf415c2607083d3b2ac'), ObjectId('5932abf415c2607083d3b2ad')]该方法返回的类型是InsertManyResult,调用inserted_ids属性可以获取**数据的_id列表。6. 查询**数据后,我们可以利用find_one()或find()方法进行查询,其中find_one()查询得到的是单个结果,find()则返回一个生成器对象。示例如下:result = collection.find_one({'name': 'Mike'})print(type(result))print(result)这里我们查询name为Mike的数据,它的返回结果是字典类型,运行结果如下:<class 'dict'>{'_id': ObjectId('5932a80115c2606a59e8a049'), 'id': '20170202', 'name': 'Mike', 'age': 21, 'gender': 'male'}可以发现,它多了_id属性,这就是MongoDB在**过程中自动添加的。此外,我们也可以根据ObjectId来查询,此时需要使用bson库里面的objectid:from bson.objectid import ObjectIdresult = collection.find_one({'_id': ObjectId('593278c115c2602667ec6bae')})print(result)其查询结果依然是字典类型,具体如下:{'_id': ObjectId('593278c115c2602667ec6bae'), 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male'}当然,如果查询结果不存在,则会返回None。对于多条数据的查询,我们可以使用find()方法。例如,这里查找年龄为20的数据,示例如下:results = collection.find({'age': 20})print(results)for result in results:    print(result)运行结果如下:<pymongo.cursor.Cursor object at 0x1032d5128>{'_id': ObjectId('593278c115c2602667ec6bae'), 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male'}{'_id': ObjectId('593278c815c2602678bb2b8d'), 'id': '20170102', 'name': 'Kevin', 'age': 20, 'gender': 'male'}{'_id': ObjectId('593278d815c260269d7645a8'), 'id': '20170103', 'name': 'Harden', 'age': 20, 'gender': 'male'}返回结果是Cursor类型,它相当于一个生成器,我们需要遍历取到所有的结果,其中每个结果都是字典类型。如果要查询年龄大于20的数据,则写法如下:results = collection.find({'age': {'$gt': 20}})这里查询的条件键值已经不是单纯的数字了,而是一个字典,其键名为比较符号$gt,意思是大于,键值为20。这里将比较符号归纳为下表。符号含义示例$lt小于{'age': {'$lt': 20}}$gt大于{'age': {'$gt': 20}}$lte小于等于{'age': {'$lte': 20}}$gte大于等于{'age': {'$gte': 20}}$ne不等于{'age': {'$ne': 20}}$in在范围内{'age': {'$in': [20, 23]}}$nin不在范围内{'age': {'$nin': [20, 23]}}另外,还可以进行正则匹配查询。例如,查询名字以M开头的学生数据,示例如下:results = collection.find({'name': {'$regex': '^M.*'}})这里使用$regex来指定正则匹配,^M.*代表以M开头的正则表达式。这里将一些功能符号再归类为下表。符号含义示例示例含义$regex匹配正则表达式{'name': {'$regex': '^M.*'}}name以M开头$exists属性是否存在{'name': {'$exists': True}}name属性存在$type类型判断{'age': {'$type': 'int'}}age的类型为int$mod数字模操作{'age': {'$mod': [5, 0]}}年龄模5余0$text文本查询{'$text': {'$search': 'Mike'}}text类型的属性中包含Mike字符串$where高级条件查询{'$where': 'obj.fans_count == obj.follows_count'}自身粉丝数等于关注数关于这些操作的更详细用法,可以在MongoDB官方文档找到:https://docs.mongodb.com/manual/reference/operator/query/。7. 计数要统计查询结果有多少条数据,可以调用count()方法。比如,统计所有数据条数:count = collection.find().count() print(count)或者统计符合某个条件的数据:count = collection.find({'age': 20}).count()print(count)运行结果是一个数值,即符合条件的数据条数。8. 排序排序时,直接调用sort()方法,并在其中传入排序的字段及升降序标志即可。示例如下:results = collection.find().sort('name', pymongo.ASCENDING)print([result['name'] for result in results])运行结果如下:['Harden', 'Jordan', 'Kevin', 'Mark', 'Mike']这里我们调用pymongo.ASCENDING指定升序。如果要降序排列,可以传入pymongo.DESCENDING。9. 偏移在某些情况下,我们可能想只取某几个元素,这时可以利用skip()方法偏移几个位置,比如偏移2,就忽略前两个元素,得到第三个及以后的元素:results = collection.find().sort('name', pymongo.ASCENDING).skip(2)print([result['name'] for result in results])运行结果如下:['Kevin', 'Mark', 'Mike']另外,还可以用limit()方法指定要取的结果个数,示例如下:results = collection.find().sort('name', pymongo.ASCENDING).skip(2).limit(2)print([result['name'] for result in results])运行结果如下:['Kevin', 'Mark']如果不使用limit()方法,原本会返回三个结果,加了限制后,会截取两个结果返回。值得注意的是,在数据库数量非常庞大的时候,如千万、亿级别,最好不要使用大的偏移量来查询数据,因为这样很可能导致内存溢出。此时可以使用类似如下操作来查询:from bson.objectid import ObjectIdcollection.find({'_id': {'$gt': ObjectId('593278c815c2602678bb2b8d')}})这时需要记录好上次查询的_id。10. 更新对于数据更新,我们可以使用update()方法,指定更新的条件和更新后的数据即可。例如:condition = {'name': 'Kevin'}student = collection.find_one(condition)student['age'] = 25result = collection.update(condition, student)print(result)这里我们要更新name为Kevin的数据的年龄:首先指定查询条件,然后将数据查询出来,修改年龄后调用update()方法将原条件和修改后的数据传入。运行结果如下:{'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}返回结果是字典形式,ok代表执行成功,nModified代表影响的数据条数。另外,我们也可以使用$set操作符对数据进行更新,代码如下:result = collection.update(condition, {'$set': student})这样可以只更新student字典内存在的字段。如果原先还有其他字段,则不会更新,也不会删除。而如果不用$set的话,则会把之前的数据全部用student字典替换;如果原本存在其他字段,则会被删除。另外,update()方法其实也是官方不推荐使用的方法。这里也分为update_one()方法和update_many()方法,用法更加严格,它们的第二个参数需要使用$类型操作符作为字典的键名,示例如下:condition = {'name': 'Kevin'}student = collection.find_one(condition)student['age'] = 26result = collection.update_one(condition, {'$set': student})print(result)print(result.matched_count, result.modified_count)这里调用了update_one()方法,第二个参数不能再直接传入修改后的字典,而是需要使用{'$set': student}这样的形式,其返回结果是UpdateResult类型。然后分别调用matched_count和modified_count属性,可以获得匹配的数据条数和影响的数据条数。运行结果如下:<pymongo.results.UpdateResult object at 0x10d17b678>1 0我们再看一个例子:condition = {'age': {'$gt': 20}}result = collection.update_one(condition, {'$inc': {'age': 1}})print(result)print(result.matched_count, result.modified_count)这里指定查询条件为年龄大于20,然后更新条件为{'$inc': {'age': 1}},也就是年龄加1,执行之后会将第一条符合条件的数据年龄加1。运行结果如下:<pymongo.results.UpdateResult object at 0x10b8874c8>1 1可以看到匹配条数为1条,影响条数也为1条。如果调用update_many()方法,则会将所有符合条件的数据都更新,示例如下:condition = {'age': {'$gt': 20}}result = collection.update_many(condition, {'$inc': {'age': 1}})print(result)print(result.matched_count, result.modified_count)这时匹配条数就不再为1条了,运行结果如下:<pymongo.results.UpdateResult object at 0x10c6384c8>3 3可以看到,这时所有匹配到的数据都会被更新。11. 删除删除操作比较简单,直接调用remove()方法指定删除的条件即可,此时符合条件的所有数据均会被删除。示例如下:result = collection.remove({'name': 'Kevin'})print(result)运行结果如下:{'ok': 1, 'n': 1}另外,这里依然存在两个新的推荐方法——delete_one()和delete_many()。示例如下:result = collection.delete_one({'name': 'Kevin'})print(result)print(result.deleted_count)result = collection.delete_many({'age': {'$lt': 25}})print(result.deleted_count)运行结果如下:<pymongo.results.DeleteResult object at 0x10e6ba4c8>14delete_one()即删除第一条符合条件的数据,delete_many()即删除所有符合条件的数据。它们的返回结果都是DeleteResult类型,可以调用deleted_count属性获取删除的数据条数。12. 其他操作另外,PyMongo还提供了一些组合方法,如find_one_and_delete()、find_one_and_replace()和find_one_and_update(),它们是查找后删除、替换和更新操作,其用法与上述方法基本一致。另外,还可以对索引进行操作,相关方法有create_index()、create_indexes()和drop_index()等。关于PyMongo的详细用法,可以参见官方文档:http://api.mongodb.com/python/current/api/pymongo/collection.html。另外,还有对数据库和集合本身等的一些操作,这里不再一一讲解,可以参见官方文档:http://api.mongodb.com/python/current/api/pymongo/。本节讲解了使用PyMongo操作MongoDB进行数据增删改查的方法。
  • [热门活动] 【★盛大公测★】MongoDB 社区增强版,计算存储分离黑科技,3 倍性价比!
    要想数据安全麻烦少,备份恢复先做好!华为云文档数据库 DDS 推出 MongoDB 社区增强版:Cloud Native文档数据库,计算存储分离黑科技,提升 10 倍备份恢复能力、10 倍故障重构能力;读写性能 300% 提升、弹性扩容能力 100 倍增强。体验传送门 》》》 高性能低成本,我们是认真的场景一:  场景二: 场景三:  确认过眼神,我们是一路人(MongoDB 社区增强版三大使用场景)互联网应用 分钟级横向扩容快人一步互联网业务增长快,满足互联网业务高横向扩展能力的要求;100GB 数据扩容及数据均衡 5 分钟内完成。 游戏场景 10倍备份恢复性能,提升回档效率超高读性能,应对游戏高峰期数据访问需求;超强横向扩展能力,满足高峰期业务压力 物联网业务 轻松承载海量数据高并发写入超高写性能,满足物联网服务海量数据高并发写入需求。 了解更多华为云数据库 MongoDB 社区增强版,请移步官网点击这里 
  • 【看点】分布式文档存储数据库 MongoDB 3.6.6 即将发布
    MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。MongoDB 官网上显示 MongoDB 3.6.6 即将发布,不过已经公布了新版的发布说明和更新日志。可以看到,该版本主要是解决了一些 issue,其他变更主要也集中在安全、分片、复制和查询方面。(内容来源:开源中国)
  • 【看点】7 月全球数据库排名:MongoDB 紧追 PostgreSQL!
    来源:开源中国 作者:OSC-王练 DB-Engines 发布了 2018 年 7 月份的数据库排名,排名前三的依然是 Oracle、MySQL 和 Microsoft SQL Server 。 前 20 名的数据库中,对比上个月,第 13 位和第 14 位的 Splunk 和 MariaDB 互换了位置,第 15 和第 16 位的 SAP Adaptive Server 和 Solr 位置进行了对调。 MongoDB 是此榜单中涨幅最大的一个,上涨 6.54 个百分点。若保持趋势,则有望挑战 PostgreSQL 的位置。 PostgreSQL 本月出现回落,下跌 4.86 的百分点。 18716 完整排名请查看:https://db-engines.com/en/ranking 前三强走势: 18717 PostgreSQL 和 MongoDB 走势: 18718 DB-Engines 排名的数据依据 5 个不同的因素: [*]Google 以及 Bing 搜索引擎的关键字搜索数量 [*]Google Trends 的搜索数量 [*]Indeed 网站中的职位搜索量 [*]LinkedIn 中提到关键字的个人资料数 [*]Stackoverflow 上相关的问题和关注者数量 这份榜单分析旨在为数据库相关从业人员提供一个技术方向的参考,其中涉及到的排名情况并非基于产品的技术先进程度或市场占有率等因素。无论排名先后,选择适合与企业业务需求相比配的技术,才是最重要的。
  • [技术干货] 常见问题FAQ(DDS)-更新至529
    问题描述回复1、华为DDS对应的的阿里和亚马逊的哪个服务?华为云DDS,对标阿里的云数据库MongoDB;对标亚马逊的DynamoDB2、华为DDS命名中为什么不直接使用MongoDB?MongoDB是由MongoDB公司运营的一款开源数据库软件,该公司有明确的商标保护。华为处于尊重原厂、遵守商标保护法的角度,采用DDS命名,寓意MongoDB是面向文档的NoSQL数据库3、华为DDS目前和阿里的最大区别是什么?阿里的MongoDB服务化开始时间较早,在数据库生态方面较全,例如大数据分析对接等功能。华为云计划今年内在生态上追平4、华为DDS目前和阿里的最大的相同点是什么?均支持MongoDB集群(Sharding)、副本集(ReplicaSet)、单节点(Single)三种架构。分别满足高可用/高扩展性需求、高可用需求、非核心业务高性价比需求的用户选型。目前华为云DDS副本集支持包年包月购买,集群支持按需购买,单节点正在公测5、华为DDS是否支持跨AZ高可用?跨AZ特性依赖于ECS是否有跨AZ的资源,6月份华东区三AZ资源到位。预计7月20日左右上线副本集跨三AZ的能力6、为什么DDS副本集、集群不考虑跨两AZ的设计?MonogoDB集群/副本集的三节点高可用架构,存在“多数派选举机制”:若将1个节点放在1个AZ,另外2个节点放在1个AZ,当另外2个节点挂了,数据库也是不可用,因此意义不大;原生MongoDB副本集/集群架构不支持实例级别的两AZ部署,需要服务改造,目前所有云商均未提供该能力7、华为DDS跟社区版MongoDB有什么区别吗?目前由于数据库通过云化,服务化封装后,关闭了一些功能,另外华为是一家非常重视安全的公司,将一些存在安全隐患的功能也关闭了,但我们会根据市场需求,陆续通过内核改造,安全加固的方式陆续开放出来,详细区别请点击查看8、什么情况下选择集群(sharding)架构?   集群是基于多个副本集(每个副本沿用三节点高可用模式)组成。集群的主要特点是横向扩展能力强,能满足用户不断增长的数据量需求,目前DDS可支持1T~12T的数据量。因此当客户对可用性要求较高、数据量较大(>2T)、未来扩展性要求较高的情况下,推荐用户使用集群架构9、什么情况下选择副本集(replica)架构?副本集是三节点高可用的结构,DDS副本集目前最大可支持1T的数据存储量。因此,当客户对可用性要求高、数据量不大(<1T)、未来扩展性要求不高的情况下,推荐用户使用副本集架构10、什么情况下选择单节点(single)架构?单节点是一个成本低、可用性相对较弱架构选型,当前最大可支持1T的数据存储量。因此,当客户对可用性要求不高(比如非核心业务/测试场景/个人学习场景,能接受数据丢失)、数据量不大的情况下,推荐用户使用单节点架构11、集群(sharding)架构里的mongos、config、shard组件分别有什么作用?三者如何配合工作的?DDS分片集群架构由路由(mongos)、配置(config)和分片(shard)组成。数据读写请求经mongos分发,通过查询config信息,并行分配到相应shard,可轻松应对高并发场景,且config和shard均采用三副本架构,保证高可用。12、副本集的三节点高可用架构,是如何保证高可用的?DDS副本集架构由主节点(Primary)、备节点(Secondary)和隐藏节点(Hidden)组成。用户可以直接操作主节点和备节点,当主节点故障时,系统自动选出新的主节点,当备节点不可用时,隐藏节点接管服务,保证高可用13、华为DDS是怎么收费的?集群目前支持按需购买,计划7月20日左右支持包周期;副本集支持按需和包周期购买;单节点目前在公测阶段。价格与友商持平,主流价格低于友商:点击查看14、华为DDS支持MongoDB的那个版本?为什么没有小版本说明?是否会支持更多版本?目前支持的版本为3.2,子版本不呈现给用户,一方面由于子版本较多,不利于统一维护,另外随着更稳定的子版本发布,我们希望能够统一维护,帮助用户分批升级。6月20日左右,DDS可支持3.4版本15、华为DDS上MongoDB的admin库下创建不collection?基于最佳实践的考虑,DDS不允许admin下mongodb创建集合。16、华为DDS上为何Hidden不让用户看到,而secendary可以让客户看到?因为首先要实现高可用,是需要3节点的(MysQL的高可用其实也是3节点,只是有一个仲裁的角色藏在后台,用户看不到),secondary可能会被用户用于只读(虽然这样做有很多问题需要考虑),所以Hidden不可缺少,但一般需要一个保留住特殊节点,避免用户侧发出额外的工作负载,这样让hidden可以做一些特殊操作,比如:备份可以在hidden上做,而不影响Primary和secondary17、建立数据库连接失败的原因有哪些?1.数据库客户端版本与DDS支持的版本不匹配;2.账号密码错误;3.开启SSL,但是用普通方式连接:点击查看18、哪里可以查看更多场常见问题?点击查看
  • [技术干货] MongoDB基于角色的访问控制
    本帖最后由 昵称 于 2018-5-27 19:04 编辑MongoDB采用基于角色的访问控制(RBAC Role-Based Access Control)来管理对MongoDB系统的访问。 用户被授予一个或多个角色来确定用户对数据库资源和操作的访问权限。 在分配的角色之外,用户无权访问系统。 启用访问控制 MongoDB默认不启用访问控制。 使用--auth(命令行参数)或security.authorization(配置文件中参数)设置启用授权。 启用内部验证还可以启用客户端授权。 一旦启用访问控制,用户必须进行身份验证。 15967 角色 角色授予在指定资源上执行指定操作的权限。 可以在角色中明确指定每个权限,或者从另一个角色继承。 权限 权限由指定资源和资源上允许的操作组成。 资源是数据库,集合,文档或集群。 如果资源是集群,则关联的操作会影响系统的状态,而不会影响特定的数据库或集合 操作 定义了指定资源上允许的操作。比如 find, insert, update,listIndexes, createUser, replSetGetStatus等 继承权限 定义一个角色,可以包含一个或多个角色,在这种情况下角色会继承所包含角色的所有权限 一个角色可以继承本数据库的其他角色的权限,在admin数据库上创建的角色可以继承任何数据库创建的角色 查看角色的权限 在showPrivileges 和 showBuiltinRoles 权限都设置为true的情况下,用户可以通过rolesInfo命令查询角色权限 用户和角色 在用户创建的时候,可以分配角色,也可以给存在的用户授予或者撤销角色 分配了角色的用户会得到该角色的所有权限,一个用户可有多个角色,通过分配给一个用户不同数据库的角色。在一个数据库创建的用户可以具有其他数据库的操作权限 第一个创建的系统用户具有管理其他用户的权限 内置角色和用户自定义角色 Mongodb提供了内置角色,提供数据库系统用户通常需要的一些权限. 参考 MongoDB内置角色 如果内置角色不足以满足需要,MongoDB提供了方法创建或者修改用户自定义角色
  • [技术干货] MongoDB添加用户与权限赋值
    本帖最后由 自在极意 于 2018-5-21 21:06 编辑增加用户 概观 MongoDB采用基于角色的访问控制(RBAC)来确定用户的访问权限。 用户被授予一个或多个角色,用于确定用户对MongoDB资源的访问权限或特权以及用户可以执行的操作。 用户应该只具有确保最小权限系统所需的最小权限集。 MongoDB系统的每个应用程序和用户都应映射到不同的用户。 此访问隔离有助于访问撤销和持续的用户维护。 先决条件 如果您为部署启用了访问控制,则可以使用localhost异常来创建系统中的第一个用户。 这第一个用户必须有权创建其他用户。 从MongoDB 3.0开始,由于本地主机异常,您只能在admin数据库上创建用户。 一旦创建第一个用户,您必须以该用户身份进行身份验证才能添加后续用户。 在启用部署的访问控制时,启用Auth提供有关添加用户的更多详细信息。 对于例行用户创建,您必须拥有以下权限:要在数据库中创建新用户,必须在该数据库资源上执行createUser操作。要向用户授予角色,您必须对角色的数据库执行grantRole操作。userAdmin和userAdminAnyDatabase内置角色在其各自的资源上提供createUser和grantRole操作。 例子 要在MongoDB部署中创建用户,请连接到部署,然后使用db.createUser()方法或createUser命令添加用户。 用户名/密码认证 以下操作使用指定的名称,密码和角色在reporting数据库中创建用户 [code]use reporting db.createUser( { user: "reportsUser", pwd: "12345678", roles: [ { role: "read", db: "reporting" }, { role: "read", db: "products" }, { role: "read", db: "sales" }, { role: "readWrite", db: "accounts" } ] } )[/code] 身份验证见:https://docs.mongodb.com/master/tutorial/enable-authentication/ Kerberos身份验证 必须使用外部认证机制(如Kerberos)对MongoDB进行身份验证的用户必须在$ external数据库中创建,这允许mongos或mongod咨询外部来源进行身份验证。对于Kerberos身份验证,您必须将Kerberos主体添加为用户名。 您不需要指定密码。以下操作将Kerberos主体[email]reportingapp@EXAMPLE.NET[/email]添加到记录数据库的只读访问权限。 [code]use $external db.createUser( { user: "reportingapp@EXAMPLE.NET", roles: [ { role: "read", db: "records" } ] } )[/code] 有关Kerberos配置的更多信息见: https://docs.mongodb.com/master/tutorial/control-access-to-mongodb-with-kerberos-authentication/ https://docs.mongodb.com/master/tutorial/control-access-to-mongodb-windows-with-kerberos-authentication/ LDAP身份验证 必须使用外部认证机制(如LDAP)对MongoDB进行身份验证的用户必须在$ external数据库中创建,这允许mongos或mongod咨询外部来源进行身份验证。 对于LDAP认证,您必须指定一个用户名。 您不需要指定密码,因为这是由LDAP服务处理的。 以下操作为reporting用户添加对records数据库的只读访问权限。 [code] monospace;="" background:="" url("https:="" media.mongodb.org="" code-block-bg.png")="" rgb(245,="" 246,="" 247);="" line-height:="" 24px;="" border-top:="" none;="" border-right:="" border-bottom:="" border-left:="" 5px="" solid="" rgb(73,="" 71,="" 71);="" border-image:="" initial;="" border-radius:="" 0px;="" color:="" rgb(34,="" 34,="" 34);"="">use $external db.createUser( { user: "reporting", roles: [ { role: "read", db: "records" } ] } )[/code] 有关LDAP细节见: https://docs.mongodb.com/master/tutorial/configure-ldap-sasl-activedirectory/ https://docs.mongodb.com/master/tutorial/configure-ldap-sasl-openldap/
  • [技术干货] Mongodb写重试
    写重试3.6版本中的新功能。如果遇到网络错误,或者在副本集或分片群集中找不到健康的主节点,则允许MongoDB进行一次写重试操作。写重试入具有以下要求 1:拓扑要求:只允许在副本集或集群的环境下进行写重试操作,单节点不支持写重试2.存储引擎要求:写重试需要支持文档级锁的存储引擎,如wiredTiger 或 in-memory。注:MMAPv1 存储引擎不支持写重试MongoDB各语言驱动版本要求:JAVA 3.6Python 3.6C 1.9Node 3.0C# 2.5Ruby 2.5PHP 1.43.MongoDB 版本集群或副本集每个节点的版本需要大于等于3.6,并且每个节点的featureCompatibilityVersion 值也必须大于等于3.6启动写重试功能1.连接mongodb时指定mongodb://localhost/?retryWrites=true2.启动mongo shell时指定mongo --retryWrites持续的网络错误 MongoDB可重试写操作只能进行一次重试尝试。 这有助于解决暂时的网络错误和副本集选举,但不能解决持续的网络错误。故障转移期如果Mongodb无法在副本集或分片集分中找到健康的主节点,则MongoDB Driver将等待serverSelectionTimeoutMS毫秒后进行写重试,若还是无法连接则放弃写入。
  • [技术干货] MongoDB之创建用户
    本帖最后由 昵称 于 2018-5-20 23:01 编辑[indent]要对 MongoDB 中的客户端进行身份认证, 必须向 MongoDB 添加相应的用户。 [/indent] 用户管理接口 要添加用户, MongoDB 提供db createUser ()方法。添加用户时, 通过为用户分配角色来授予权限。 还可以更新现有用户, 例如更改密码和授予或撤消角色。 注意:在数据库中创建的第一个用户应该是具有管理其他用户权限的用户管理员。 身份认证数据库 添加用户时, 将在特定数据库中创建用户。此数据库是用户的身份认证数据库。 用户可以在不同的数据库中具有权限。即, 用户的权限不限于其身份认证数据库。通过指定用户角色到其他数据库中, 在一个数据库中创建的用户可以具有对其他数据库读取访问的权限。 用户的名称和身份认证数据库作为该用户的唯一标识符。即, 如果两个用户同名但在不同的数据库中创建, 则它们是两个独立的用户。如果您打算创建具有多个数据库权限的单个用户, 请创建该用户角色指定到相应的数据库中, 而不是在不同的数据库中多次创建用户。 用户认证 要对用户进行身份认证, 必须提供与该用户关联的用户名、密码和身份认证数据库。 要使用mongo shell 进行身份认证, 请执行以下操作之一: [*]使用mongo命令行连接到mongod 或 mongos实例时,身份认证选项 (--username, --password, and --authenticationDatabase) [*]首先连接到mongod 或 mongos实例, 然后对身份认证数据库。运行身份认证命令db.auth() 注意:在一次连接请求中,将多次身份认证为不同的用户时,不会去除以前经过身份认证的用户的凭据。这可能导致连接的权限超出了用户的预期, 并导致逻辑会话中的操作引发错误。 集中管理用户数据 MongoDB 存储所有用户信息, 包括用户名称、 用户密码和 用户的身份认证数据库, 在admin数据库的system.user集合中。 不要直接访问该集合, 而是使用用户管理命令。 分片集群用户 要创建分片集群的用户, 请连接到 mongos实例并添加用户。然后, 客户端通过mongos实例对这些用户进行身份认证。 MongoDB 将这些分片集群用户数据存储在配置服务器的admin数据库中。2.6版本之前, 对分片集群上的数据库进行身份认证的凭据驻留在该数据库的主shard上。 shard本地用户 某些维护操作 (如cleanupOrphaned、reconfig ()) 需要直接连接到shard上操作。若要执行这些操作, 必须直接连接到shard上, 并使用shard本地用户进行身份验证。 要创建shard本地管理用户, 须直接连接到shard上并创建用户。存储shard的admin的数据库中。 这些shard本地用户完全独立于通过mongos添加到分片集群的用户。shard本地用户作用于shard的范围, 不能通过mongos访问。 直接连接到shard只应用于特定于shard的维护和配置。通常, 客户端应通过mongos连接到分片集群。 Localhost Exception localhost exception允许您启用访问控制, 然后在系统中创建第一个用户。使用localhostexception, 在启用访问控制后, 连接到本地主机端口并在admin数据库中创建第一个用户。第一个用户必须具有创建其他用户的权限, 例如具有 userAdmin 或 userAdminAnyDatabase 角色的用户。 MongoDB 3.4 扩展了localhostexception允许执行方法 db. createRole ()。此方法允许通过 ldap 授权的用户在 MongoDB 中创建一个ldap 中定义的角色。 MongoDB 3.0 localhost exception发生了变化, 建立的连接仅仅具有在admin数据库中创建第一个用户的权限。在以前的版本中, 使用localhostexception获取访问权限的连接对 MongoDB 实例的访问是无限制的。 只有在 MongoDB 实例中没有创建用户时, localhost exception才适用。 对于分片集群, localhost exception分别适用于每个分片以及整个集群。创建分片集群并通过 mongos 实例添加用户管理员后, 仍然必须防止对各个shard进行未经授权的访问,可以对集群中的每个分片执行下列步骤之一: [*]创建一个系统用户 [*]在启动时禁用localhost exception. 设置 enableLocalhostAuthBypass = 0
  • [技术干货] MongoDB内置角色
    内置角色 MongoDB提供了内置角色,可以提供数据库系统中通常需要的不同访问级别。 内置数据库用户角色和数据库管理角色角色存在于每个数据库中。 admin数据库包含其他角色。 数据库用户角色 每个数据库都包含如下角色 read提供读取所有非系统集合和system.indexes,system.js和system.namespaces系统集合的数据的能力。 readWrite提供读取角色的所有权限以及修改所有非系统集合和system.js集合上的数据的能力。 数据库管理角色 每个数据库都包含以下数据库管理角色: dbAdmin提供执行管理任务的能力,如与schema相关的任务,indexing和收集统计信息。 此角色不授予用户和角色管理的权限。 dbOwner提供对数据库执行任何管理操作的能力。 此角色结合了readWrite,dbAdmin和userAdmin角色授予的权限。 userAdmin提供在当前数据库上创建和修改角色和用户的能力。 由于userAdmin角色允许用户向任何用户(包括他们自己)授予任何特权,因此角色还间接为数据库或(如果限制为管理数据库,则为集群提供超级用户访问权限)集群提供超级用户访问权限。 集群管理角色 admin数据库包含以下用于管理整个系统而不是特定数据库的角色。 这些角色包括但不限于副本集和分片群集管理功能。 clusterAdmin提供最佳的群集管理访问。 此角色结合了由clusterManager,clusterMonitor和hostManager角色授予的权限。 此外,该角色还提供dropDatabase操作。 clusterManager在集群上提供管理和监视操作。 具有此角色的用户可以分别访问分别用于分片和复制的配置和本地数据库。 clusterMonitor为监控工具提供只读访问权限,如MongoDB Cloud Manager和Ops Manager监控代理。 hostManager提供监视和管理服务器的能力。 备份恢复角色admin数据库包含以下用于备份和恢复数据的角色: backup提供备份数据所需的权限。 此角色提供足够的权限来使用MongoDB Cloud Manager备份代理,Ops Manager备份代理或使用mongodump。 restore提供使用mongorestore恢复数据所需的特权,而不使用--oplogReplay选项或system.profile收集数据。 全数据库角色管理数据库中的这些角色适用于除mongod实例中的local数据库和config数据库之外的所有数据库: readyAnyDatabase提供与read相同的只读权限,除了它适用于群集中除local和config数据库以外的所有权限。 该角色还在整个集群上提供listDatabases操作。 readWriteAnyDatabase提供与readWrite相同的读取和写入权限,除了它适用于群集中除local和config数据库外的所有数据。 该角色还在整个集群上提供listDatabases操作。 userAdminAnyDatabase提供与userAdmin相同的用户管理操作访问权限,除了它适用于群集中除local和config数据库以外的所有操作。 dbAdminAnyDatabase提供与dbAdmin相同的数据库管理操作访问权限,除了它适用于群集中除local数据库和config数据库之外的所有数据库管理操作。 该角色还在整个集群上提供listDatabases操作。 超级用户以下角色为所有资源提供完整权限: root提供对操作和所有readWriteAnyDatabase,dbAdminAnyDatabase,userAdminAnyDatabase,clusterAdmin,restore和backup组合的资源的访问。 内部角色 system提供对数据库中的任何对象采取任何操作的权限。
  • [技术干货] mongodb compass 使用(二)
    15643
  • [技术干货] mongodb compass 使用(一)
    15418 15419