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