MongoDB就是多个集合组成的数据库,而每个集合又是由多个文档组成。python
文档:mysql
#相似于 { "_id" : ObjectId("5d2944d421b631f231d08056"), "username" : "李阳", "password" : "123456", "age" : 25, "gender" : "male", "dept" : [ { "title" : "生产部" }, { "title" : "品质部" } ] } #这样的被称为文档 #文档是可嵌套的 #文档中key值惟1、区分大小写、而且不可重复 #文档中的键值对是有序的
集合:sql
#集合就是一组文档 #文档相似于关系库里的行 #集合相似于关系库里的表 #集合中的文档无需固定的结构(非关系型)
1、环境安装mongodb
一、pymongo安装数据库
(automatic) C:\Users\Administrator>pip install pymongo
二、检测是否安装成功ide
(automatic) C:\Users\Administrator>python Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AM D64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import pymongo >>>
2、python操做MongoDBpost


from pymongo import MongoClient from datetime import datetime from bson.objectid import ObjectId class MongoDatabase: def __new__(cls, *args, **kwargs): """单例模式""" if not hasattr(cls,"instance"): cls.instance = super(MongoDatabase,cls).__new__(cls, *args, **kwargs) return cls.instance def __init__(self): """ 链接数据库 """ self.client = MongoClient() self.db = self.client['test'] def add_one(self): """ 添加一条数据 :return: """ post = { "author": "aaa", "text": "bbb", "date": datetime.utcnow() } return self.db.table1.insert_one(post) # 向数据库test的table1表中添加数据 def get_one(self): """ 查询一条数据 :return: """ return self.db.table1.find_one() def get_more(self): """ 查询多条数据 :return: """ return self.db.table1.find({'author': 'aaa'}) def get_one_from_id(self, id): """ 经过id查询数据 :return: """ obj = ObjectId(id) return self.db.table1.find_one({"_id": obj}) def update_one_data(self): """ 经过id更新一条数据 :return: """ result=self.db.table1.update_one({'text':'bbb'},{'$inc':{'x':10}})#找到text=bbb这条数据而且将其中的x数值加10 return result def update_many_data(self): """ 更新多条数据 :return: """ result=self.db.table1.update_many({},{'$inc':{'x':10}})#找到全部数据而且将其中的x数值加10 return result def delete_one(self): """ 删除一条数据:若是有多条知足条件,只删除第一条 :return: """ result=self.db.table1.delete_one({'text':'bbb'}) return result def delete_many(self): """ 删除多条数据 :return: """ result=self.db.table1.delete_many({}) return result def main(): mongo_obj = MongoDatabase() print(mongo_obj) # 新增数据 # result=mongo_obj.add_one() # print(result.inserted_id)#5d286c7bbf18433e81e4f16f # 查询数据 # result=mongo_obj.get_one() # print(result) #字典类型,result['id'] # 查询多条数据 # result=mongo_obj.get_more() # # for item in result: # # print(item['text']) # 经过id查询数据 # result = mongo_obj.get_one_from_id('5d286c7bbf18433e81e4f16f') # print(result) #更新一条数据 # result=mongo_obj.update_one_data() # print(result.matched_count) # print(result.modified_count) #删除一条数据 # result=mongo_obj.delete_one() # print(result.delete_count) if __name__ == '__main__': main()
3、ODM操做ui
一、安装mongoengine模块spa
(automatic) C:\Users\Administrator>pip install mongoengine
二、检测是否安装成功3d
(automatic) C:\Users\Administrator>python Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AM D64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import mongoengine >>>
三、模型介绍
mongoengine模块至关于mysql数据库中的sqlalchemy模块,对数据库进行一种对象化的操做,比起原生的操做来的更加方便。
(1)数据类型
BinaryField BooleanField ComplexDateTimeField DateTimeField DecimalField DictField DynamicField EmailField EmbeddedDocumentField EmbeddedDocumentListField FileField FloatField GenericEmbeddedDocumentField GenericReferenceField GenericLazyReferenceField GeoPointField ImageField IntField ListField MapField ObjectIdField ReferenceField LazyReferenceField SequenceField SortedListField StringField URLField UUIDField PointField LineStringField PolygonField MultiPointField MultiLineStringField MultiPolygonField
每一个字段类型均可以设置参数:
db_field (默认值:无) #MongoDB字段名称。 required (默认值:False) #若是设置为True且未在文档实例上设置字段,则在ValidationError验证文档时将引起a 。 default (默认值:无) #未为此字段设置值时使用的值。 unique (默认值:False) #若是为True,则集合中的任何文档都不具备此字段的相同值。 unique_with (默认值:无) #字段名称(或字段名称列表)与此字段一块儿使用时,集合中不会有两个具备相同值的文档。 primary_key (默认值:False) #若是为True,请使用此字段做为集合的主键。 DictField 和EmbeddedDocuments都支持做为文档的主键。 choices (默认值:无) #应该限制该字段的值的可迭代(例如列表,元组或集合)选择。 #例如:
SIZE = (('S' , 'Small' ), ('M' , 'Medium' ), ('L' , 'Large' ), ('XL' , 'Extra Large' ), ('XXL' , '额外超大' )) class Shirt (Document ): size = StringField (max_length = 3 , choices = SIZE )
**kwargs (可选的) #能够提供其余元数据做为任意其余关键字参数。可是,您没法覆盖现有属性。常见的选择包括help_text和verbose_name,它们一般由表单和窗口小部件库使用。
(2)建立模型
from mongoengine import connect, Document, StringField, IntField, EmbeddedDocument, ListField, EmbeddedDocumentField connect('userinfo') #链接数据库,默认链接本地 GENDER_CHOICES = ( ('male', '男'), ('female', '女'), ) class Dept(EmbeddedDocument): """ 部门表 """ title = StringField(max_length=32, required=True) class User(Document): """ 用户表 """ username = StringField(max_length=32, required=True) password = StringField(max_length=64, required=True) age = IntField(required=True) gender = StringField(choices=GENDER_CHOICES, required=True) dept = ListField(EmbeddedDocumentField(Dept)) # 关联部门表 meta = { 'collection': 'user' # 指定保存在什么文档中 }
上面的User表至关于集合,它是继承Document类,而dept实际是User表中的一个字段,每个用户实例都至关于一个文档(集合中的一行数据),具体能够看生成的具体数据:
四、操做模型
在建立模型后,就须要对模型中的数据进行CURD,建立一个类来进行操做:
class MongoEngine(object): def add_one(self): """ 增长一条数据 :return: """ product_department = Dept( title="生产部" ) quality_department = Dept( title="品质部" ) user_obj = User( username='李阳', password='123456', age=20, gender='male', dept=[product_department, quality_department] ) user_obj.save() return user_obj def get_one(self): """查询一条数据""" return User.objects.first() def get_more(self): """查询多条数据""" return User.objects.all() def get_from_id(self, id): """根据id进行查询""" return User.objects.filter(pk=id).first() def update_one(self): """修改单条数据""" return User.objects.filter(gender='male').update_one(inc__age=5) def update_more(self): """修改多条数据""" return User.objects.filter(gender='male').update(inc__age=5) def delete_one(self): """删除一条数据""" return User.objects.filter(gender='male').first().delete() def delete_from_id(self,id): """根据id进行删除""" return User.objects.get(pk=id).delete() def delete_more(self): """删除多条数据""" return User.objects.filter(gender='male').delete()
五、完整实例


from mongoengine import connect, Document, StringField, IntField, EmbeddedDocument, ListField, EmbeddedDocumentField connect('userinfo') #链接数据库,默认链接本地 GENDER_CHOICES = ( ('male', '男'), ('female', '女'), ) class Dept(EmbeddedDocument): """ 部门表 """ title = StringField(max_length=32, required=True) class User(Document): """ 用户表 """ username = StringField(max_length=32, required=True) password = StringField(max_length=64, required=True) age = IntField(required=True) gender = StringField(choices=GENDER_CHOICES, required=True) dept = ListField(EmbeddedDocumentField(Dept)) # 关联部门表 meta = { 'collection': 'user' # 指定保存在什么文档中 } class MongoEngine(object): def add_one(self): """ 增长一条数据 :return: """ product_department = Dept( title="生产部" ) quality_department = Dept( title="品质部" ) user_obj = User( username='李阳', password='123456', age=20, gender='male', dept=[product_department, quality_department] ) user_obj.save() return user_obj def get_one(self): """查询一条数据""" return User.objects.first() def get_more(self): """查询多条数据""" return User.objects.all() def get_from_id(self, id): """根据id进行查询""" return User.objects.filter(pk=id).first() def update_one(self): """修改单条数据""" return User.objects.filter(gender='male').update_one(inc__age=5) def update_more(self): """修改多条数据""" return User.objects.filter(gender='male').update(inc__age=5) def delete_one(self): """删除一条数据""" return User.objects.filter(gender='male').first().delete() def delete_from_id(self,id): """根据id进行删除""" return User.objects.get(pk=id).delete() def delete_more(self): """删除多条数据""" return User.objects.filter(gender='male').delete() def main(): mongo_obj = MongoEngine() # 添加一条数据 user_obj=mongo_obj.add_one() print(user_obj.id) # 查询一条数据 # user_obj=mongo_obj.get_one() # print(user_obj.id,user_obj.username) # 查询全部数据 # queryset = mongo_obj.get_more() # for user_obj in queryset: # print(user_obj.id, user_obj.username) # 修改数据 # result = mongo_obj.update_one() # print(result) # 删除数据 # result = mongo_obj.delete_one() # print(result) # obj = mongo_obj.delete_from_id('5d2944a2a1bd1324ebe43d68') # print(obj) if __name__ == '__main__': main()