mongoDB是一个基于分布式文件存储的数据库,介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。关系型数据库遵循原子性,一致性,独立性,持久性规则,而非关系型数据库不需要固定的模式,无需多余的操作就可以横向扩展。
1. 在官网下载安装mongodb数据库
https://www.mongodb.com/download-center?jmp=nav#community
2. 在命令行中启动服务器控制台
mongod.exe --nojournal --dbpath . 无日志,保存与当前路径,切换到安装目录下的bin目录中启动
3. 启动客户端
mongo.exe
4. 常用操作
use test #切换数据库,使用test数据库 db.blogg.insert({'id':1,'title':'myblog'}) #向当前数据库blogg表中插入文档 db.blogg.find() #查询当前数据库blogg表中的文档 db.blogg.find({'id':1}) db.blogg.findOne() db.blogg.update({'id':2},{'$set':{'title':'yourBlog'}}) #使用$set修改指定键值对 db.blogg.update({'id':2},{'$set':{'title-2':'yourBlog'}}) #如果键值不存在则使用$set增加指定键值对 db.blogg.update({'id':2},{'$unset':{'title-2':'yourBlog'}}) #使用$unset取消指定键值对 db.blogg.update({'id':2},{'$inc':{'id':1}}) #增减指定键的值,id=3 db.blogg.update({'id':4},{'$set':{'size':4}},true) #第三个参数为true,无则创建,有匹配更新 db.blogg.update({'id':1},{'$set':{'commet':'mm'}},false,true) #第四个参数为true,更新多个匹配文档 db.blogg.remove({'id':4}) #删除指定的文档 show dbs #显示所有数据库 show collections #显示所有的集合 db.blog.drop() #删除blog这个集合 db.dropDatabase() #删除数据库
5. python连接mongodb,安装连接mongo的驱动,pip install pymongo
>>> import pymongo >>> pymongo.version '3.5.1' >>> mc = pymongo.MongoClient() #连接数据库 >>> db_proj = mc.proj #指定数据库 >>> col_stud = db_proj.stud #指定集合 >>> adoc = {'id':1,'name':'mike','age':12,'parents':['green','john']} >>> col_stud.insert_one(adoc) #插入文档 <pymongo.results.InsertOneResult object at 0x0000023B9A5C2848> >>> col_stud.find_one() ##查询 {'name': 'mike', '_id': ObjectId('59d5ce9c5dc75f55d0389247'), 'id': 3, 'age': 15} >>> col_stud.update_one({'name':'mike'},{'$set':{'age':11}}) #更新 <pymongo.results.UpdateResult object at 0x0000023B9A5DC848> >>> col_stud.find_one({'name':'mike'})['age'] 11 >>> col_stud.replace_one({'name':'mike'}, {'id':3,'name':'mike','age':15}) #替换 <pymongo.results.UpdateResult object at 0x0000023B9A5DC908> >>> for doc in col_stud.find({'id':3}): print(doc['id'],doc['name'],doc['age']) 3 mike 15 3 mary 13
6. mongoengine,安装pip install mongoengine
>>> from mongoengine import * >>> connect('test') MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True, read_preference=Primary()) >>> class User(Document): uid = SequenceField(primary_key=True) name = StringField(null=True,required=True) age = IntField(min_value=6,max_value=16) weight = FloatField(max_value=60) >>> u = User() >>> u.name = 'mary' >>> u.age = 11 >>> u.weight=30.7 >>> u.save() <User: User object> >>> ua = User(name='honey',age=13,weight=28.9) >>> ua.save() <User: User object> >>> u.id 3 >>> ua.id 4 >>> u.update(age=14) 1 >>> u.reload() # #先reload(),后访问 <User: User object> >>> u.age 14 >>> u.update(inc__age=2) # #使用自增 1 >>> u.reload() <User: User object> >>> u.age 16 >>> u.delete() #删除数据,数据依然存在与内存中,但是在数据库中已不存在 >>> User.objects [<User: User object>, <User: User object>, <User: User object>] >>> User.objects[0] <User: User object> >>> for item in User.objects: print(item.name,item.age,item.weight) Jone 13 32.5 Mike 12 30.5 honey 13 28.9 >>> User.objects.count() 3 >>> len(User.objects) 3
7. mongodbengine查询
>>> class User(Document): userid = SequenceField(primary_key=True) name = StringField(max_length=20) age = IntField(min_value=6,max_value=17) weight = FloatField(max_value=60) >>> users_data = [{"name":"Mike","age":12,"weight":30.5},] >>> users_data = [{"name":"Mike","age":12,"weight":30.5},{"name":"Jone","age":13,"weight":32.5},{"name":"lily","age":12,"weight":34.5},{"name":"lisa","age":12,"weight":31.8}] >>> for d in users_data: User(**d).save() #字典对象 <User: User object> <User: User object> <User: User object> <User: User object> >>> for d in User.objects: print(d.userid,d.name,d.age,d.weight) 2 Jone 13 32.5 1 Mike 12 30.5 3 lily 12 34.5 4 lisa 12 31.8 >>> User.objects.sum('age') 49 >>> User.objects.sum('age') / User.objects.count() 12.25 >>> User.objects(age__lt=13).sum('weight') 96.8 >>> User.objects .average('age') 12.25 >>> User.objects.distinct('age') #distinct(),去重 [13, 12] >>> d = User.objects(age=12).only('name').first() #only(),只包含'name' >>> d.userid 1 >>> d.name 'Mike' >>> d.age >>> d.weight >>> d = User.objects(age=12).exclude('name').first() #exclude(),只去除'name' >>> d.userid 1 >>> d.name >>> d.age 12 >>> d.reload() #使用reload()重新加载 <User: User object> >>> d.name 'Mike' >>> d = User.objects(age=12).exclude('name').all_fields().first() #all_fields(),所有值 >>> d.userid 1 >>> d.name 'Mike' >>> d.age 12 >>> d.weight 30.5 >>> for d in User.objects(weight__gt=31): #gt 大于 print(d.userid,d.name,d.age,d.weight) 2 Jone 13 32.5 3 lily 12 34.5 4 lisa 12 31.8 >>> for d in User.objects(weight__ne=31): #ne 不等于 print(d.userid,d.age,d.name,d.weight) 2 13 Jone 32.5 1 12 Mike 30.5 3 12 lily 34.5 4 12 lisa 31.8
8. 一对一关系,使用ReferenceField建立一对一关联关系
>>> class Waiter(Document): name = StringField(max_length=20) custom = ReferenceField(User) #使用ReferenceField建立一对一关联关系 >>> w = Waiter() >>> w.name = 'Wtr A' >>> w.custom = d >>> w.save() <Waiter: Waiter object> >>> w = Waiter.objects.first() >>> w.name 'Wtr A' >>> w.custom.name 'lisa' >>> w.custom.age 12
9. 一对多
>>> class Member(EmbeddedDocument): name = StringField(max_length=20) >>> class Team(Document): name = StringField(max_length=30) members = ListField(EmbeddedDocumentField(Member)) >>> ma = Member(name='Lisa') >>> mb = Member(name='Mike') >>> t = Team(name='victory',members=[ma,mb]) >>> t.save() <Team: Team object> >>> t = Team.objects[0] >>> for m in t.members: print(m.name) Lisa Mike
10. 对文件读写
>>> class Uf(Document): name = StringField() photo = FileField() >>> fp = open(r'C:Userswl18883Desktoppythonpython DB est.jpg','rb') >>> uf = Uf(name='Lisa') >>> uf.photo.put(fp,content_type='image/jpeg') >>> uf.save() <Uf: Uf object> >>> fp.close() >>> p = Uf.objects[0].photo.read() >>> fp = open(r'C:Userswl18883Desktoppythonpython DB icai.jpg','wb+') >>> fp.write(p) 45191 >>> fp.close()