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()