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
原文地址:https://www.cnblogs.com/yeteng/p/11337763.html