zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    在opencv3中实现机器学习之:利用正态贝叶斯分类
    在opencv3中进行图片人脸检测
    在opencv3中利用SVM进行图像目标检测和分类
    在opencv3中实现机器学习之:利用svm(支持向量机)分类
    在matlab和opencv中分别实现稀疏表示
    opencv2学习:计算协方差矩阵
    用python简单处理图片(3):添加水印
    Google protocol buffer在windows下的编译
    GEOS库学习之五:与GDAL/OGR结合使用
    GEOS库学习之四:几何关系判断
  • 原文地址:https://www.cnblogs.com/yeteng/p/11337763.html
Copyright © 2011-2022 走看看