mongoengine是django框架下models操作mongodb數據庫的方式,和關系型數據庫操作方法一樣,通過models對象操作調用,使用更加簡單靈活。而pymongo則類似於原生的mongodb操作,當然執行效率也更高。
之前一直以為只是寫法不一樣,總不是對mongodb數據庫的增刪改查。結果最近遇到一個坑。
通過pymongo插入的數據(表模型見下面,其中shop_id是主鍵,真實存在數據庫是_id),但是通過mongoengine的方法是查詢不到的。而且該種方法插入的數據字段是隨意的,並不是建模的順序。
原因: 這兩種操作方式是獨立的,通過mongoengine插入的數據,會按照模型建立好映射和關聯,所以可以查詢到。而pymongo則是原生的插入(未建立shop_id和_id的映射),插入過程中用到最多的就是字典,字典是無序的所以mongodb表中字段順序也是隨意的。
建議:pymongo更多用於查詢,是完全沒問題的,如果插入數據就需要注意實際業務中是否要混用兩種模式,避免通過主key查詢不到的坑。
圖一、pymongo插入的記錄,mongoengine通過主鍵查詢不到
圖二、表模型
===== 當mongo表中歷史記錄無新添加的字段時==========
def test_pymongo(): """ 測試pymongo原生的,其中kw_num字段模型有定義,但是表中無 pymongon相當於返回的是字典,沒有該字段會報keyerror,可用 get方法避免(a.get('kw_num')) """ acc = account_coll.find({'_id': 151193047}) for a in acc: print a print a['_id'], a['balance'], a['kw_num'] def test_mongonengine(): """ 測試mongonegnine的,其中kw_num字段模型有定義,但是表中無 mongonegnine相當於模型對象,沒有值,會取模型中的默認值,無默認值則為None,不會報錯 """ acc = Account.objects.filter(shop_id=151193047) for a in acc: print a print a.shop_id, a.balance, a.kw_num