[{"data":1,"prerenderedAt":66},["ShallowReactive",2],{"article-52":3},{"code":4,"msg":5,"data":6,"count":14},200,"查询成功",{"id":7,"title":8,"keywords":9,"description":10,"category_id":11,"content":12,"body_html":13,"thumb_up":14,"clicks":15,"sort":14,"remark":16,"status":17,"is_open":17,"is_deleted":14,"is_top":14,"is_recommend":14,"create_time":18,"update_time":19,"image_id":20,"url":13,"member_id":14,"cate_name":21,"prev":22,"next":25,"tags":28,"words":37,"read_time":38,"comments":17,"cover":39,"relevant":40},52,"Python语言对MongoDB的相关操作","python,mongo,数据库","MongoDB是由C++语言编写的非关系型数据库，是一个基于分布式文件存储的开源数据库系统，其内容存储形式类似于JSON对象，它的字段值可以包含其他文档，数组以及文档数组，非常灵活。",5,"MongoDB是由C++语言编写的非关系型数据库，是一个基于分布式文件存储的开源数据库系统，其内容存储形式类似于JSON对象，它的字段值可以包含其他文档，数组以及文档数组，非常灵活。\n\n1、准备工作\n\n确保电脑安装了MongoDB并启动了其服务，并且安装了PyMongo库，本文不做介绍。\n\n2、连接MongoDB\n\n连接MongoDB是，需要哦使用PyMongo库中的MongoClient。\n\n```python\nimport pymongo\n#client = pymongo.MongoClient(host='127.0.0.1', port=27017)\nclient = pymongo.MongoClient('mongodb:\u002F\u002F127.0.0.1:27017\u002F')\n#两种写法都可以达到相同的连接效果\n```\n\n3、指定数据库\n\nMongoDB中可以建立多个数据库，需要指定操作的数据库。\n\n```python\ndb = client.test\n#db = client['test]\n#两种方法等价\n```\n\n4、指定集合\n\nMongoDB的每个数据库又包含许多集合（collection），类似于关系型数据库中的表。与指定数据库类似。\n\n```python\ncollection = db.students\n#collection = db['students']\n```\n\n这样我们便声明了一个Collection对象\n\n5、插入数据\n\n新建一条学生数据，以字典形式表示：\n\n```python\nstudent = {\n    'id':'20170104',\n    'name':'Tomr',\n    'age':20,\n    'gender':'male'\n}\n```\n\n这里指定了学生的学号、姓名、年龄和性别。直接调用collection的insert()方法即可插入数据\n\n```python\nres = collection.insert(student)\nprint(res)\n```\n\n在MongoDB中，每条数据都有一个_id属性来唯一标识。如果没有显式指明该属性，MongoDB会自动产生一个ObjectId类型的 _id属性。insert()方法会执行后返回 _id值\n\n运行结果如下\n\n```python\n5cb1ea2230f1f4dfdcfa9234\n```\n\n还可同时插入多条数据，只需要以列表形式传递即可。\n\n```python\nstudent = {\n    'id':'20170104',\n    'name':'Tomr',\n    'age':20,\n    'gender':'male'\n}\nstudent1 = {\n    'id':'20170102',\n    'name':'Mike',\n    'age':25,\n    'gender':'male'\n}\nres = collection.insert([student,student1])\nprint(res)\n#返回结果是对应的 _id集合\n[ObjectId('5cb1eab130f1f4dc848730da'), ObjectId('5cb1eab130f1f4dc848730db')]\n```\n\n官方推荐使用insert_one()和insert_many()方法分别插入单条记录和多条记录。\n\n```python\nstudent = {\n    'id':'20170104',\n    'name':'Tomr',\n    'age':20,\n    'gender':'male'\n}\nres = collection.insert_one(student)\nprint(res)\nprint(res.inserted_id)\n#运行结果\n\u003Cpymongo.results.InsertOneResult object at 0x0000019DF8C92C88>\n5cb1eb5e30f1f4e04005dbfd\n```\n\n与insert()方法不同，返回的是InsertOneResult对象，调用其inserted_id属性获取 _id\n\n对于insert_many()方法，将数据以列表形式传递。\n\n```python\nstudent = {\n    'id':'20170104',\n    'name':'Tomr',\n    'age':20,\n    'gender':'male'\n}\nstudent1 = {\n    'id':'20170102',\n    'name':'Mike',\n    'age':25,\n    'gender':'male'\n}\n\nres = collection.insert_many([student,student1])\nprint(res)\nprint(res.inserted_ids)\n#运行结果\n\u003Cpymongo.results.InsertManyResult object at 0x000001A658EC95C8>\n[ObjectId('5cb1ec1b30f1f4c0fcb7a87b'), ObjectId('5cb1ec1b30f1f4c0fcb7a87c')]\n```\n\n返回的类型是InsertManyResult对象，调用inserted_ids属性可以获取插入数的 _id列表\n\n6、查询\n\n查询使用find_one()或find()方法进行查询，其中find_one()查询得到的是单个结果，find()则返回一个生成器对象。\n\n```python\nres = collection.find_one({'name':'Mike'})\nprint(type(res))\nprint(res)\n\n```\n\n返回结果是字典类型，运行结果如下\n\n```python\n\u003Cclass 'dict'>\n{'_id': ObjectId('5cb1a00330f1f4aac47fad27'), 'id': '20170102', 'name': 'Mike', 'age': 25, 'gender': 'male'}\n\n```\n\n也可以根据ObjectId来查询，此时需要使用bson库里面的objectid\n\n```python\nfrom bson.objectid import ObjectId\nres = collection.find_one({'_id':ObjectId('5cb1a00330f1f4aac47fad27')})\nprint(type(res))\nprint(res)\n#运行结果\n\u003Cclass 'dict'>\n{'_id': ObjectId('5cb1a00330f1f4aac47fad27'), 'id': '20170102', 'name': 'Mike', 'age': 25, 'gender': 'male'}\n\n```\n\n如果查询结果不存在，则返回None\n\n查询多条数据使用find()\n\n```python\nres = collection.find({'age':20})\nprint(type(res))\nprint(res)\nfor item in res:\n    print(item)\n#运行结果\n\u003Cclass 'pymongo.cursor.Cursor'>\n\u003Cpymongo.cursor.Cursor object at 0x000001C8D596FD68>\n{'_id': ObjectId('5cb19fa930f1f4aa3c2439d5'), 'id': '20170101', 'name': 'Tom', 'age': 20, 'gender': 'male'}\n{'_id': ObjectId('5cb1a00330f1f4aac47fad26'), 'id': '20170104', 'name': 'Tomr', 'age': 20, 'gender': 'male'}\n{'_id': ObjectId('5cb1a03a30f1f4a55459e359'), 'id': '20170104', 'name': 'Tomr', 'age': 20, 'gender': 'male'}\n\n```\n\n返回结果是Cursor类型，相当于一个生成器。\n\n查询年龄大于20的数据\n\n```python\nres = collection.find({'age':{'$gt':20}})\n\n```\n\n比较符号归纳如下\n\n| 符号 |    含义    |           示例           |\n| :--: | :--------: | :----------------------: |\n| $lt  |    小于    |    {‘age':{'$lt':20}}    |\n| $gt  |    大于    |    {‘age':{'$gt':20}}    |\n| $lte |  小于等于  |   {‘age':{'$lte':20}}    |\n| $gte |  大于等于  |   {‘age':{'$gte':20}}    |\n| $ne  |   不等于   |    {‘age':{'$ne':20}}    |\n| $in  |  在范围内  | {‘age':{'$in':[20,30]}}  |\n| $nin | 不在范围内 | {‘age':{'$nin':[20,30]}} |\n\n还可以进行正则匹配查询，例如查询名字以M开头的学生数据，示例如下：\n\n```python\nres = collection.find({'name':{'$regex':'^M.*'}})\nfor item in res:\n    print(item)\n\n```\n\n| 符号    | 含义           | 示例                                           | 示例含义                       |\n| ------- | -------------- | ---------------------------------------------- | ------------------------------ |\n| $regex  | 匹配正则表达式 | {'name':{'$regex':'^M.*'}}                     | name以M开头                    |\n| $exists | 属性是否存在   | {'name':{'$exists':True}}                      | name属性存在                   |\n| $type   | 类型判断       | {'age':{'$type':'int'}}                        | age的类型为int                 |\n| $mod    | 数字模操作     | {'age':{'$mod':[5,0]}}                         | 年龄模5余0                     |\n| $text   | 文本查询       | {'$text':{'$search':'Mike'}}                   | text类型的属性中包含Mike字符串 |\n| $where  | 高级条件查询   | {'$where':'obj.fans_count==obj.follows_count'} | 自身粉丝数等于关注数           |\n\n7、计数\n\n统计查询结果，可以调用count()方法\n\n```python\nres = collection.find().count()\nprint(res)\n#运行结果\n12\n\n```\n\n统计符合条件的数据总数\n\n```python\nres = collection.find({'name':{'$regex':'^M.*'}}).count()\nprint(res)\n#运行结果\n4\n\n```\n\n8、排序\n\n直接调用sort()方法，并在其中传入排序的字段以及升降序标志即可\n\n```python\nres = collection.find().sort('name', pymongo.ASCENDING)\nprint([item['name'] for item in res])\n#运行结果\n['Mike', 'Mike', 'Mike', 'Mike', 'Tom', 'Tomr', 'Tomr', 'Tomr', 'Tomr', 'Tomr', 'Tomr', 'Tomr']\n\n```\n\n其中pymongo.ASCENDING指定升序，pymongo.DESCENDING指定降序\n\n9、偏移\n\n只是查询几个元素，可以使用skip()方法便宜几个位置，比如偏移3，就忽略前三个元素，得到第四个以后的元素\n\n```python\nres = collection.find().sort('name', pymongo.ASCENDING).skip(3)\nprint([item['name'] for item in res])\n#运行结果\n['Mike', 'Tom', 'Tomr', 'Tomr', 'Tomr', 'Tomr', 'Tomr', 'Tomr', 'Tomr']\n\n```\n\n还可以使用limit()方法指定要取结果个数，\n\n```python\nres = collection.find().sort('name', pymongo.ASCENDING).skip(3).limit(2)\nprint([item['name'] for item in res])\n#运行结果\n['Mike', 'Tom']\n\n```\n\n注意的是，在数据库数量非常庞大的时候，如千万，亿级别，最好不要使用大的派年以来来查询数据，可能会导致内存溢出，可以类似如下操作查询。\n\n```py\nfrom bson.objectid import ObjectId\nres = collection.find_one({'_id':{'$gt': ObjectId('5cb1a00330f1f4aac47fad27')}})\n\n```\n\n这时需要记录上次查询的 _id。\n\n10、更新\n\n数据更新可以使用update()方法，指定更新的条件和更新后的数据即可。\n\n```python\ncondition = {'name':'Tom'}\nst = collection.find_one(condition)\nprint('更新前')\nprint(st)\nst['age'] = 20\nres = collection.update(condition, st)\nprint(res)\nprint('更新后')\nst = collection.find_one(condition)\nprint(st)\n#运行结果\n更新前\n{'_id': ObjectId('5cb19fa930f1f4aa3c2439d5'), 'id': '20170101', 'name': 'Tom', 'age': 25, 'gender': 'male'}\nres = collection.update(condition, st)\n{'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True}\n更新后\n{'_id': ObjectId('5cb19fa930f1f4aa3c2439d5'), 'id': '20170101', 'name': 'Tom', 'age': 20, 'gender': 'male'}\n\n```\n\n更新结果返回字典形式，ok代表执行成功，nModified代表影响的数据条数。\n\n也可以使用$set操作符对数据进行更新\n\n```python\nres = collection.update(condition, {'$set',st})\n\n```\n\n这样可以只更新st字典中存在的字段，如果原先还有其他字段，则不hi更新，也不会删除。而不用$set，则会把之前的数据全部用st字典替换，原本存在其他字段，则会被删除。\n\n官方推荐使用update_on()和update_many()方法，用法更加严格。它们的第二个参数需要使用$类型操作符作为字典的键名。\n\n```python\nst['age'] = 30\n#res = collection.update(condition, st)\n#res = collection.update(condition, {'$set',st})\nres = collection.update_one(condition, {'$set':st})\nprint(res)\nprint(res.matched_count, res.modified_count)\n#结果\n\u003Cpymongo.results.UpdateResult object at 0x00000188BDA89B88>\n1 1\n\n```\n\n第二个参数不能直接传入修改后的字典，俄日是需要使用{'$set':st}这样的形式，返回结构是UpdateResult类型，分别调用matched_count和modified_count属性，可以获得匹配的数据条数和影响的数据条数。\n\n```python\ncondition = {'age':{'$gt':20}}\nres = collection.update_one(condition, {'$inc':{'age':1}})\nprint(res)\nprint(res.matched_count, res.modified_count)\n#结果\n\u003Cpymongo.results.UpdateResult object at 0x00000243ACB70308>\n1 1\n\n```\n\n指定查询条件为年龄大于20，更新条件为{'$inc':{'age':1}，也就是年龄加1,执行之后将第一条符合条件的数据年龄加1。\n\n调用update_many()方法，则将所有符合条件的数据都更新\n\n```python\ncondition = {'age':{'$gt':20}}\nres = collection.update_many(condition, {'$inc':{'age':1}})\nprint(res)\nprint(res.matched_count, res.modified_count)\n#运行结果\n\u003Cpymongo.results.UpdateResult object at 0x00000206A9C89608>\n5 5\n\n```\n\n11、删除\n\n删除操作比较简单。直接使用remove()方法指定删除的条件即可，符合条件的所有数均会被删除。\n\n```python\nres = collection.remove({'name':'Tom'})\nprint(res)\n#运行结果\n{'n': 1, 'ok': 1.0}\n\n```\n\n还可使用推荐方法delete_one()和delete_many().\n\n```python\nres = collection.delete_one({'name':'Mike'})\nprint(res)\nprint(res.deleted_count)\nres = collection.delete_many({'age':{'$lt':30}})\nprint(res)\nprint(res.deleted_count)\n运行结果\n\u003Cpymongo.results.DeleteResult object at 0x0000019068652848>\n1\n5\n\n```\n\ndelete_one()删除第一条符合条件的数据，delete_many()删除所有符合条件的数据，返回结果都是DeleteResult类型，可以调用delete_count()属性获取删除的数据条数.\n\n12、其他操作\n\nPyMongo还提供了一些组合方法，如find_one_and_delete()，find_one_and_replace()和find_one_and_update()表示查找后删除，替换，更新操作，用法一致。\n\n还可以对索进行操作，有create_index(),create_indexes()和drop_index()\n\n",null,0,508,"",1,"2019-04-14 12:00:33","2026-04-19 14:59:06",127,"Python",{"id":23,"title":24},51,"Centos7安装后修改yum和epel源",{"id":26,"title":27},53,"Linux环境下Apahce的调优",[29,31,34],{"id":30,"name":21},27,{"id":32,"name":33},29,"MongoDB",{"id":35,"name":36},28,"数据库",5521,13,"https:\u002F\u002Ftp.myong.top\u002Fstorage\u002Farticle\u002Fde\u002F36593248f37397d88a6a0d873ebaad.jpg",[41,46,51,56,61],{"id":42,"title":43,"create_time":44,"description":45},95,"Django启用memcache缓存","2020-10-23 11:17:27","在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面.当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力.",{"id":47,"title":48,"create_time":49,"description":50},91,"用Python实现编程语言 20 年的动态排行榜","2020-06-24 16:06:54","爬取一下，自2001年5月至今，TIOBE 编程语言排行榜上编程语言的变化情况，看一下在接近20年的时间里，编程语言的热度是如何变化的。\r\n",{"id":52,"title":53,"create_time":54,"description":55},100,"re正则表达式","2021-07-10 18:09:52","正则表达式是一个特殊的字符序列，它能帮助你方便的检查一个字符串是否与某种模式匹配，本文罗列re正则表达式中，常用的匹配符号。",{"id":57,"title":58,"create_time":59,"description":60},34,"Python基础整理之列表常见操作","2019-02-10 16:53:55","列表是最常用的Python数据类型，它可以作为一个方括号内的逗号分隔值出现。列表的数据项不需要具有相同的类型",{"id":62,"title":63,"create_time":64,"description":65},63,"Python与mysqldump的数据库备份","2019-10-14 15:35:33","mysqldump是备份MySQL数据库的一种好工具。它相对于用phpmyadmin等备份工具更加快速，又避免受php.ini等的限制，在windows系统下还可以结合计划任务实现定时远程备份数据库",1783431664462]