django中pymongo和mongoengine使用的注意點


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM