mongodb基本使用
一、mongodb简介
MongoDB是一个基于分布式文件存储的数据库,是介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
二、安装与配置
https://blog.csdn.net/congcong68/article/details/44277469
三、mongodb的增删改查
(一)数据库操作
1 use blog #切换数据库,没有时会创建 3 show dbs #查看所有的数据库(数据库必须有数据才会显示) 5 db.dropDatabase() #删除数据库
(二)collection操作
集合就是相当于关系数据库中的表
1 use blog #切换数据库 2 db.article.insert({'title':'python'}) #创建集合article并插入数据,db指当前用的数据库 3 show tables #查看集合(表) 4 db.article.drop() #删除集合
(三)文档操作
文档相当于关系数据库中的记录
1、添加文档
1 user0 = {'name':'alex',...} 2 db.test.insert(user0) #插入单条 3 user1 = {...} 4 user2 = {...} 5 user3 = {...} 6 db.test.insertMany([user1,user2,user3]) #插入多条
2、查看文档
1 db.user.find() #查看集合中所有文档 2 db.user.find().pretty() #格式化展示输出结果 3 db.user.findOne() #只取匹配成功的第一个 4 5 db.user.find({相当于where条件},{相当于select条件}) 6 7 ###########比较运算########## 8 '$gt','$lt','$gte','$lte','$ne' 分别代表大于、小于、大于等于、小于等于、不等于 9 10 db.user.find({'name':'alex'}) #查询name等于alex的 11 12 db.user.find({'name':{"$ne":'alex'}}) # #查询name不等于alex的 13 14 db.user.find({'_id':{'$gt':2}}) #id大于2的 15 16 db.user.find({"_id":{"$gte":2,}}) #id大于等于2的 17 18 19 ###########逻辑运算########## 20 '$or' 或;'$not' 非;字典中多个条件用逗号分隔是and关系 21 22 db.user.find({'_id':{"$gte":2,"$lt":4}} #id大于等于2,小于4的 23 db.user.find({"_id":{"$gte":2},"age":{"$lt":40}}) #id等于2,年龄小于40的 24 25 db.user.find({"$or":[{'_id':{"$gte":5}}, {"name":"alex"} ]}) #id大于等于5或name等于alex的 26 27 db.user.find({'_id':{"$mod":[2,1]}}) #id除以2余数为1的 28 29 db.user.find({'_id':{"$not":{"$mod":[2,1]}}}) #id除以2余数为1的 30 取反 31 32 ###########成员运算########## 33 db.user.find({'age':{'$in':[20,30,31]}}) #in 34 35 db.user.find({'age':{'$nin':[20,30]}}) # not in 36 37 38 ###########正则匹配########## 39 /正则表达式/i ,i表示模式 40 db.user.find({'name':/^j.*?(g|n)$/i}) 41 42 ###########取指定的字段########## 43 44 db.user.find({'_id':3},{''name':1,'age':1}) #1表示取,0表示不取 45 注意:{''name':1,'age':1},字典内要么都是1,要么都是0,不能既有1又有0,但是'_id'除外 46 47 ###########查询数组########## 48 直接用点取值 49 50 db.user.find({'hobbies':'dancing'}) #查询hobbies对应列表中有dancing的人 51 db.user.find({"hobbies.3":'tea'}) #查询hobbies对应列表的第四个值为tea的 52 53 db.user.find({},{'hobbies':{"$slice":-2})#查询所有人最后两个爱好 54 55 ###########排序########## 56 57 db.user.find().sort({"age":-1,'_id':1}) # 1代表升序,-1代表降序 58 59 ###########分页########## 60 61 db.user.find().sort({'age':1}).limit(1).skip(2) #limit代表取多少个,skip代表跳过前面多少个 62 63 ###########统计数量########## 64 65 db.user.count({'age':{"$gt":30}}) 66 或 db.user.find({'age':{"$gt":30}}).count() 67 68 ###########其他########## 69 {'key':null} 匹配key的值为null或者没有这个key 70 71 db.t2.find({"b":null}) #b为null或没有b的
3、更新文档
1 ######### update()方法 ####### 2 3 对比update db1.t1 set name='EGON',sex='Male' where name='egon' and age=18; 4 5 update() 方法用于更新已存在的文档。语法格式如下: 6 db.collection.update( 7 <query>, //查询条件,相当于where 8 <update>, //update的对象和一些更新的操作符,相当于set 9 { 10 upsert: <boolean>, //可选,默认false,代表不存在update的记录不更新也不插入,设为true,表示插入 11 multi: <boolean>, // 可选,默认false,代表只更新找到的第一条几录,设为true,代表更新全部 12 writeConcern: <document> //可选,抛出异常的级别 13 } 14 )
1 #########覆盖更新####### 2 用新的文档替换匹配的文档 3 db.user.update({'age':20},{"name":"Wxx","hobbies_count":3})#是用{"_id":2,"name":"Wxx","hobbies_count":3}覆盖原来的记录 4 5 #########局部更新####### 6 只更新文档的一部分内容 7 8 db.user.update({'_id':6},{"$set":{"name":"egon","age":18}},{"upsert":true}) #没匹配成功会新插入一条 9 10 db.user.update({'_id':{"$gt":4}},{"$set":{"age":38}},{"multi":true}) #更新多条 11 12 #########自增自减####### 13 db.user.update({},{ "$inc":{"age":1}}, { "multi":true }) #所有人年龄加一岁 14 db.user.update({},{ "$inc":{"age":-1}}, { "multi":true }) #所有人年龄减一岁 15 16 #########添加删除数组内的元素####### 17 添加删除数组内元素:$push,$pop,$pull 18 19 #1、为名字为yuanhao的人添加一个爱好read 20 db.user.update({"name":"yuanhao"},{"$push":{"hobbies":"read"}}) 21 22 #2、为名字为yuanhao的人一次添加多个爱好tea,dancing 23 db.user.update({"name":"yuanhao"},{"$push":{ 24 "hobbies":{"$each":["tea","dancing"]} 25 }}) 26 27 按照位置且只能从开头或结尾删除元素:$pop 28 #3、{"$pop":{"key":1}} 从数组末尾删除一个元素 29 30 db.user.update({"name":"yuanhao"},{"$pop":{ 31 "hobbies":1} 32 }) 33 34 #4、{"$pop":{"key":-1}} 从头部删除 35 db.user.update({"name":"yuanhao"},{"$pop":{ 36 "hobbies":-1} 37 }) 38 39 #5、按照条件删除元素,:"$pull" 把符合条件的统统删掉,而$pop只能从两端删 40 db.user.update({'addr.country':"China"},{"$pull":{ 41 "hobbies":"read"}},{ "multi":true}) 42 43 #########避免重复添加####### 44 "$addToSet" 45 46 db.urls.insert({"_id":1,"urls":[]}) 47 48 #下面只会添加一次 49 db.urls.update({"_id":1},{"$addToSet":{'urls':'http://baidu'}}) 50 db.urls.update({"_id":1},{"$addToSet":{'urls':'http://baidu'}})
4、删除文档
1 #1、删除多个中的第一个 2 db.user.deleteOne({ 'age': 8 }) 3 4 #2、删除国家为China的全部 5 db.user.deleteMany( {'addr.country': 'China'} ) 6 7 #3、删除全部 8 db.user.deleteMany({})
四、在python中的使用---pymongo模块
基本使用:
#插入单个文档 result = collection.insert(student) print(result) #插入多个文档 result = collection.insert([student1, student2]) print(result) # 实际上在PyMongo 3.X版本中,insert()方法官方已经不推荐使用了,当然继续使用也没有什么问题, # 官方推荐使用insert_one()和insert_many()方法将插入单条和多条记录分开。
1 import pymongo 2 3 client = pymongo.MongoClient(host='localhost',port=27017) 4 5 #指定数据库 6 db = client.blog 7 print(db) 8 #指定集合 9 collection = db.user 10 #查询多个 11 # for el in collection.find(): 12 # print(el) 13 14 #只返回查询到的第一个结果 15 # result = collection.find_one({'age':{'$gt':10}}) 16 # print(result) 17 18 19 #使用正则查询 20 res = collection.find({'name':{'$regex':'^w.*'}}) 21 # for el in res: 22 # print(el) 23 24 #计数 25 count = collection.find().count() 26 print(count) 27 28 #排序 多个条件 29 ret = collection.find().sort([('name',pymongo.ASCENDING),('age',pymongo.DESCENDING)]) 30 for el in ret: 31 print(el)
1 #对于数据更新可以使用update()方法,指定更新的条件和更新后的数据即可 2 condition = {'name': 'Kevin'} 3 student = collection.find_one(condition) 4 student['age'] = 25 5 result = collection.update(condition, student) 6 print(result) 7 8 #update()方法其实也是官方不推荐使用的方法,在这里也分了#update_one()方法和update_many()方法,用法更加严格, 9 # 第二个参数需要使用$类型操作符作为字典的键名 10 condition = {'name': 'Kevin'} 11 student = collection.find_one(condition) 12 student['age'] = 26 13 result = collection.update_one(condition, {'$set': student}) 14 print(result) 15 print(result.matched_count, result.modified_count) 16 # 在这里调用了update_one方法,第二个参数不能再直接传入修改后的字典,而是需要使用{'$set': student}这样的形式, 17 # 其返回结果是UpdateResult类型,然后调用matched_count和modified_count属性分别可以获得匹配的数据条数和影响的数据条数。 18 19 # 运行结果: 20 # <pymongo.results.UpdateResult object at 0x10d17b678> 21 # 1 0 22 23 condition = {'age': {'$gt': 20}} 24 result = collection.update_many(condition, {'$inc': {'age': 1}}) 25 print(result) 26 print(result.matched_count, result.modified_count) 27 # 这时候匹配条数就不再为1条了,运行结果如下: 28 # 29 # <pymongo.results.UpdateResult object at 0x10c6384c8> 30 # 3 3
#删除
直接调用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> # 1 # 4 # delete_one()即删除第一条符合条件的数据,delete_many()即删除所有符合条件的数据,返回结果是DeleteResult类型, # 可以调用deleted_count属性获取删除的数据条数。
关于$的其他功能符号:
# 在这里将一些功能符号再归类如下: """ 符号含义示例示例含义 $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'}自身粉丝数等于关注数 """