Python与MongoDB交互
创建管理员
> use admin switched to db admin > db admin > db.createUser({user:'admin',pwd:'123456',roles:[{role:'userAdminAnyDatabase',db:'admin'}]}) Successfully added user: { "user" : "admin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] } > exit
创建普通用户
> use mydb switched to db mydb > db.createUser({user:'guest',pwd:'123456',roles:[{role:'readWrite',db:'mydb'}]}) Successfully added user: { "user" : "guest", "roles" : [ { "role" : "readWrite", "db" : "mydb" } ] } > db.auth('guest','123456') 1
删除用户
db.dropUser("guest")
连接Mongodb
import pymongo # 建立MongoDB数据库连接 # connection = pymongo.Connection('192.168.198.128', 27017) # 如果设置了权限,注意xxx用户权限要可以cover到后面使用到的数据库 # client = pymongo.MongoClient('192.168.198.128', 27017, username='guest', password='123456') client = pymongo.MongoClient('192.168.198.128',27017) # 连接所需数据库,test为数据库名 db=client.test # db_name = 'test' # db = client[db_name] # 连接所用集合,也就是我们通常所说的表,test为表名 # db和collection都是延时创建的,在添加Document时才真正创建 collection=db.test
添加数据
first_name = ["陈","张","李","王","赵"] second_name = ["冰","鑫","程","爱","暖"] third_name = ["强","国","明","风","芬"] data = [ {"_id":int("1000"+str(i)), "name":random.choice(first_name)+ random.choice(second_name)+ random.choice(third_name), "age":random.randint(16,60), "high":random.randint(170,190), "list":list(random.randint(1,200) for i in range(10)) } for i in range(5) ] try: for record in data: collection.save(record) except pymongo.errors.DuplicateKeyError: print('record exists') except Exception as e: print(e)
删除数据
collection.delete_many({'age':{'$gt':20,'$lt':30}}) #删除所有满足条件的文档,删除_id大于6,小于100 collection.delete_one({'age':20}) #删除一条满足条件的文档,删除_id=6 #collection_set01.delete_many({}) #删除整个集合
更新数据
collection.replace_one({'_id': 10000}, {'name': '王宝宝'}) #replace_one用指定的key-value替代原来所有的key-value collection.update_one({"_id": {'$lt': 10008}}, {'$set': {"age": "19"}}) #update_one更新已经对应的key-value,其它不变 collection.update_many({'_id': {'$gt': 10007}}, {'$set': {'age': '50'}}) #同上,能够update所有符合匹配条件的文档
查询数据
print(' ------------身高小于180:') print(type(collection.find({'high':{'$lt':180}}))) for row in collection.find({'high':{'$lt':180}}): print(row) print(type(collection.find_one({'high':{'$lt':180}}))) print('use find_one:',collection.find_one({'high':{'$lt':180}})['high']) print('use find_one:',collection.find_one({'high':{'$lt':180}})) print(' ------------查询特定键') print('------------查询身高大于170,并只列出_id,high和age字段(使用列表形式_id默认打印出来,可以使用{}忽视_id):') for row in collection.find({'high':{'$gt':170}},projection=['high','age']): print(row) print(' ------------skip参数用法') for row in collection.find({'high':{'$gt':170}},['high','age'],skip=1): print(row) for row in collection.find({'high':{'$gt':170}},['high','age']).skip(1): print(row) print(' ------------limit参数用法') for row in collection.find({'high':{'$gt':170}},['high','age'],limit=1): print(row) print(' ------------用{}描述特定键') for row in collection.find({'high':{'$gt':170}},{'high':1,'age':1,'_id':False}): print(row) print(' ------------多条件查询') print(collection.find_one({'high':{'$gt':10},'age':{'$lt':26,'$gt':10}})) # for u in db.users.find({"age":{"$nin":(23, 26, 32)}}): # print u # select * from users where age not in (23, 26, 32) print(' ------------count') print(collection.find({"age":{"$gt":20}}).count()) print(' ------------条件或') print('大于等于29或者小于23') for row in collection.find({"$or":[{"age":{"$lte":23}}, {"age":{"$gte":29}}]}): print(row) print(' ------------exists') for row in collection.find({'age':{'$exists':True}}): print('age exists',row) # select * from 集合名 where exists 键1 for row in collection.find({'age':{'$exists':False}}): print('age not exists',row) print(' ------------正则表达式查询') print('method 1') for row in collection.find({'name':{'$regex':r'.*暖.*'}}): print(row) print('method 2') import re Regex = re.compile(r'.*爱.*',re.IGNORECASE) for row in collection.find({'name':Regex}): print(row) print(' ------------使用sort排序(文档中没有排序的字段也会打印出来,表示最小)') print('------------age 升序') for row in collection.find().sort([["age",pymongo.ASCENDING]]): print(row) print('------------age 降序') for row in collection.find().sort([("age",-1)]): print(row) print('------------age升序,high升序') for row in collection.find().sort((("age",pymongo.ASCENDING),("high",pymongo.ASCENDING))): print(row) print('------------age升序,high降序') for row in collection.find(sort=[("age",pymongo.ASCENDING),("high",pymongo.ASCENDING)]): print(row) print(' ------------$all') for row in collection.find({'list':{'$all':[77,117,165,37,57,49,178,90,3,166]}}): print(row) print(' ------------$in') for row in collection.find({'list':{'$in':[2,3,4]}}): print(row) print(' ------------size=10') for row in collection.find({'list':{'$size':10}}): print(row) # print('-------------------$unset') # print('$unset和$set相反表示移除文档属性') # print('---before') # for row in collection.find({'name': "张程芬"}): # print(row) # collection.update({'name':'张程芬'},{'$unset':{'age':1}}) # print('---after') # for row in collection.find({'name':'张程芬'}): # print(row)
完整代码文件
import pymongo import random def add_data(collection): first_name = ["陈","张","李","王","赵"] second_name = ["冰","鑫","程","爱","暖"] third_name = ["强","国","明","风","芬"] data = [ {"_id":int("1000"+str(i)), "name":random.choice(first_name)+ random.choice(second_name)+ random.choice(third_name), "age":random.randint(16,60), "high":random.randint(170,190), "list":list(random.randint(1,200) for i in range(10)) } for i in range(5) ] try: for record in data: collection.save(record) except pymongo.errors.DuplicateKeyError: print('record exists') except Exception as e: print(e) def delete_data(collection): remove_before = collection.find() print('---------------delete before--------------------') for obj in remove_before: print(obj) collection.delete_many({'age':{'$gt':20,'$lt':30}}) #删除所有满足条件的文档,删除_id大于6,小于100 collection.delete_one({'age':20}) #删除一条满足条件的文档,删除_id=6 #collection_set01.delete_many({}) #删除整个集合 remove_after = collection.find() print('---------------delete after--------------------') for obj in remove_after: print(obj) def update_data(collection): collection.replace_one({'_id': 10000}, {'name': '王宝宝'}) #replace_one用指定的key-value替代原来所有的key-value collection.update_one({"_id": {'$lt': 10008}}, {'$set': {"age": "19"}}) #update_one更新已经对应的key-value,其它不变 collection.update_many({'_id': {'$gt': 10007}}, {'$set': {'age': '50'}}) #同上,能够update所有符合匹配条件的文档 def select_data(collection): print(' ------------身高小于180:') print(type(collection.find({'high':{'$lt':180}}))) for row in collection.find({'high':{'$lt':180}}): print(row) print(type(collection.find_one({'high':{'$lt':180}}))) print('use find_one:',collection.find_one({'high':{'$lt':180}})['high']) print('use find_one:',collection.find_one({'high':{'$lt':180}})) print(' ------------查询特定键') print('------------查询身高大于170,并只列出_id,high和age字段(使用列表形式_id默认打印出来,可以使用{}忽视_id):') for row in collection.find({'high':{'$gt':170}},projection=['high','age']): print(row) print(' ------------skip参数用法') for row in collection.find({'high':{'$gt':170}},['high','age'],skip=1): print(row) for row in collection.find({'high':{'$gt':170}},['high','age']).skip(1): print(row) print(' ------------limit参数用法') for row in collection.find({'high':{'$gt':170}},['high','age'],limit=1): print(row) print(' ------------用{}描述特定键') for row in collection.find({'high':{'$gt':170}},{'high':1,'age':1,'_id':False}): print(row) print(' ------------多条件查询') print(collection.find_one({'high':{'$gt':10},'age':{'$lt':26,'$gt':10}})) # for u in db.users.find({"age":{"$nin":(23, 26, 32)}}): # print u # select * from users where age not in (23, 26, 32) print(' ------------count') print(collection.find({"age":{"$gt":20}}).count()) print(' ------------条件或') print('大于等于29或者小于23') for row in collection.find({"$or":[{"age":{"$lte":23}}, {"age":{"$gte":29}}]}): print(row) print(' ------------exists') for row in collection.find({'age':{'$exists':True}}): print('age exists',row) # select * from 集合名 where exists 键1 for row in collection.find({'age':{'$exists':False}}): print('age not exists',row) print(' ------------正则表达式查询') print('method 1') for row in collection.find({'name':{'$regex':r'.*暖.*'}}): print(row) print('method 2') import re Regex = re.compile(r'.*爱.*',re.IGNORECASE) for row in collection.find({'name':Regex}): print(row) print(' ------------使用sort排序(文档中没有排序的字段也会打印出来,表示最小)') print('------------age 升序') for row in collection.find().sort([["age",pymongo.ASCENDING]]): print(row) print('------------age 降序') for row in collection.find().sort([("age",-1)]): print(row) print('------------age升序,high升序') for row in collection.find().sort((("age",pymongo.ASCENDING),("high",pymongo.ASCENDING))): print(row) print('------------age升序,high降序') for row in collection.find(sort=[("age",pymongo.ASCENDING),("high",pymongo.ASCENDING)]): print(row) print(' ------------$all') for row in collection.find({'list':{'$all':[77,117,165,37,57,49,178,90,3,166]}}): print(row) print(' ------------$in') for row in collection.find({'list':{'$in':[2,3,4]}}): print(row) print(' ------------size=10') for row in collection.find({'list':{'$size':10}}): print(row) # print('-------------------$unset') # print('$unset和$set相反表示移除文档属性') # print('---before') # for row in collection.find({'name': "张程芬"}): # print(row) # collection.update({'name':'张程芬'},{'$unset':{'age':1}}) # print('---after') # for row in collection.find({'name':'张程芬'}): # print(row) def main(): client = pymongo.MongoClient('192.168.198.128', 27017, username='guest', password='123456') db = client.test collection = db.test add_data(collection) update_data(collection) select_data(collection) delete_data(collection) if "__main__" == __name__: main()
输出结果
------------身高小于180: <class 'pymongo.cursor.Cursor'> {'_id': 10002, 'name': '赵爱风', 'age': 24, 'high': 172, 'list': [37, 116, 190, 120, 15, 101, 95, 159, 43, 34]} {'_id': 10003, 'name': '李爱风', 'age': 31, 'high': 170, 'list': [170, 167, 197, 184, 58, 83, 79, 122, 149, 11]} <class 'dict'> use find_one: 172 use find_one: {'_id': 10002, 'name': '赵爱风', 'age': 24, 'high': 172, 'list': [37, 116, 190, 120, 15, 101, 95, 159, 43, 34]} ------------查询特定键 ------------查询身高大于170,并只列出_id,high和age字段(使用列表形式_id默认打印出来,可以使用{}忽视_id): {'_id': 10001, 'age': 21, 'high': 186} {'_id': 10002, 'age': 24, 'high': 172} {'_id': 10004, 'age': 41, 'high': 182} ------------skip参数用法 {'_id': 10002, 'age': 24, 'high': 172} {'_id': 10004, 'age': 41, 'high': 182} {'_id': 10002, 'age': 24, 'high': 172} {'_id': 10004, 'age': 41, 'high': 182} ------------limit参数用法 {'_id': 10001, 'age': 21, 'high': 186} ------------用{}描述特定键 {'age': 21, 'high': 186} {'age': 24, 'high': 172} {'age': 41, 'high': 182} ------------多条件查询 {'_id': 10001, 'name': '王鑫风', 'age': 21, 'high': 186, 'list': [133, 19, 191, 74, 113, 39, 95, 149, 91, 103]} ------------count 4 ------------条件或 大于等于29或者小于23 {'_id': 10001, 'name': '王鑫风', 'age': 21, 'high': 186, 'list': [133, 19, 191, 74, 113, 39, 95, 149, 91, 103]} {'_id': 10003, 'name': '李爱风', 'age': 31, 'high': 170, 'list': [170, 167, 197, 184, 58, 83, 79, 122, 149, 11]} {'_id': 10004, 'name': '李程明', 'age': 41, 'high': 182, 'list': [122, 1, 80, 145, 151, 114, 143, 56, 122, 100]} ------------exists age exists {'_id': 10000, 'name': '王宝宝', 'age': '19'} age exists {'_id': 10001, 'name': '王鑫风', 'age': 21, 'high': 186, 'list': [133, 19, 191, 74, 113, 39, 95, 149, 91, 103]} age exists {'_id': 10002, 'name': '赵爱风', 'age': 24, 'high': 172, 'list': [37, 116, 190, 120, 15, 101, 95, 159, 43, 34]} age exists {'_id': 10003, 'name': '李爱风', 'age': 31, 'high': 170, 'list': [170, 167, 197, 184, 58, 83, 79, 122, 149, 11]} age exists {'_id': 10004, 'name': '李程明', 'age': 41, 'high': 182, 'list': [122, 1, 80, 145, 151, 114, 143, 56, 122, 100]} ------------正则表达式查询 method 1 method 2 {'_id': 10002, 'name': '赵爱风', 'age': 24, 'high': 172, 'list': [37, 116, 190, 120, 15, 101, 95, 159, 43, 34]} {'_id': 10003, 'name': '李爱风', 'age': 31, 'high': 170, 'list': [170, 167, 197, 184, 58, 83, 79, 122, 149, 11]} ------------使用sort排序(文档中没有排序的字段也会打印出来,表示最小) ------------age 升序 {'_id': 10001, 'name': '王鑫风', 'age': 21, 'high': 186, 'list': [133, 19, 191, 74, 113, 39, 95, 149, 91, 103]} {'_id': 10002, 'name': '赵爱风', 'age': 24, 'high': 172, 'list': [37, 116, 190, 120, 15, 101, 95, 159, 43, 34]} {'_id': 10003, 'name': '李爱风', 'age': 31, 'high': 170, 'list': [170, 167, 197, 184, 58, 83, 79, 122, 149, 11]} {'_id': 10004, 'name': '李程明', 'age': 41, 'high': 182, 'list': [122, 1, 80, 145, 151, 114, 143, 56, 122, 100]} {'_id': 10000, 'name': '王宝宝', 'age': '19'} ------------age 降序 {'_id': 10000, 'name': '王宝宝', 'age': '19'} {'_id': 10004, 'name': '李程明', 'age': 41, 'high': 182, 'list': [122, 1, 80, 145, 151, 114, 143, 56, 122, 100]} {'_id': 10003, 'name': '李爱风', 'age': 31, 'high': 170, 'list': [170, 167, 197, 184, 58, 83, 79, 122, 149, 11]} {'_id': 10002, 'name': '赵爱风', 'age': 24, 'high': 172, 'list': [37, 116, 190, 120, 15, 101, 95, 159, 43, 34]} {'_id': 10001, 'name': '王鑫风', 'age': 21, 'high': 186, 'list': [133, 19, 191, 74, 113, 39, 95, 149, 91, 103]} ------------age升序,high升序 {'_id': 10001, 'name': '王鑫风', 'age': 21, 'high': 186, 'list': [133, 19, 191, 74, 113, 39, 95, 149, 91, 103]} {'_id': 10002, 'name': '赵爱风', 'age': 24, 'high': 172, 'list': [37, 116, 190, 120, 15, 101, 95, 159, 43, 34]} {'_id': 10003, 'name': '李爱风', 'age': 31, 'high': 170, 'list': [170, 167, 197, 184, 58, 83, 79, 122, 149, 11]} {'_id': 10004, 'name': '李程明', 'age': 41, 'high': 182, 'list': [122, 1, 80, 145, 151, 114, 143, 56, 122, 100]} {'_id': 10000, 'name': '王宝宝', 'age': '19'} ------------age升序,high降序 {'_id': 10001, 'name': '王鑫风', 'age': 21, 'high': 186, 'list': [133, 19, 191, 74, 113, 39, 95, 149, 91, 103]} {'_id': 10002, 'name': '赵爱风', 'age': 24, 'high': 172, 'list': [37, 116, 190, 120, 15, 101, 95, 159, 43, 34]} {'_id': 10003, 'name': '李爱风', 'age': 31, 'high': 170, 'list': [170, 167, 197, 184, 58, 83, 79, 122, 149, 11]} {'_id': 10004, 'name': '李程明', 'age': 41, 'high': 182, 'list': [122, 1, 80, 145, 151, 114, 143, 56, 122, 100]} {'_id': 10000, 'name': '王宝宝', 'age': '19'} ------------$all ------------$in ------------size=10 {'_id': 10001, 'name': '王鑫风', 'age': 21, 'high': 186, 'list': [133, 19, 191, 74, 113, 39, 95, 149, 91, 103]} {'_id': 10002, 'name': '赵爱风', 'age': 24, 'high': 172, 'list': [37, 116, 190, 120, 15, 101, 95, 159, 43, 34]} {'_id': 10003, 'name': '李爱风', 'age': 31, 'high': 170, 'list': [170, 167, 197, 184, 58, 83, 79, 122, 149, 11]} {'_id': 10004, 'name': '李程明', 'age': 41, 'high': 182, 'list': [122, 1, 80, 145, 151, 114, 143, 56, 122, 100]} ---------------delete before-------------------- {'_id': 10000, 'name': '王宝宝', 'age': '19'} {'_id': 10001, 'name': '王鑫风', 'age': 21, 'high': 186, 'list': [133, 19, 191, 74, 113, 39, 95, 149, 91, 103]} {'_id': 10002, 'name': '赵爱风', 'age': 24, 'high': 172, 'list': [37, 116, 190, 120, 15, 101, 95, 159, 43, 34]} {'_id': 10003, 'name': '李爱风', 'age': 31, 'high': 170, 'list': [170, 167, 197, 184, 58, 83, 79, 122, 149, 11]} {'_id': 10004, 'name': '李程明', 'age': 41, 'high': 182, 'list': [122, 1, 80, 145, 151, 114, 143, 56, 122, 100]} ---------------delete after-------------------- {'_id': 10000, 'name': '王宝宝', 'age': '19'} {'_id': 10003, 'name': '李爱风', 'age': 31, 'high': 170, 'list': [170, 167, 197, 184, 58, 83, 79, 122, 149, 11]} {'_id': 10004, 'name': '李程明', 'age': 41, 'high': 182, 'list': [122, 1, 80, 145, 151, 114, 143, 56, 122, 100]}
参考博客:https://www.cnblogs.com/diaosir/p/6507178.html