MongoDB就是多個集合組成的數據庫,而每一個集合又是由多個文檔組成。
文檔:
#類似於 { "_id" : ObjectId("5d2944d421b631f231d08056"), "username" : "李陽", "password" : "123456", "age" : 25, "gender" : "male", "dept" : [ { "title" : "生產部" }, { "title" : "品質部" } ] } #這樣的被稱為文檔 #文檔是可嵌套的 #文檔中key值唯一、區分大小寫、並且不可重復 #文檔中的鍵值對是有序的
集合:
#集合就是一組文檔 #文檔類似於關系庫里的行 #集合類似於關系庫里的表 #集合中的文檔無需固定的結構(非關系型)
一、環境安裝
1、pymongo安裝
(automatic) C:\Users\Administrator>pip install pymongo
2、檢測是否安裝成功
(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 >>>
二、python操作MongoDB

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()
三、ODM操作
1、安裝mongoengine模塊
(automatic) C:\Users\Administrator>pip install mongoengine
2、檢測是否安裝成功
(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 >>>
3、模型介紹
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表中的一個字段,每一個用戶實例都相當於一個文檔(集合中的一行數據),具體可以看生成的具體數據:
4、操作模型
在創建模型后,就需要對模型中的數據進行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()
5、完整實例

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