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
  • 相关阅读:
    STC项目风险分析
    “四则运算练习器”的开发心得与优化方案
    针对“订餐系统”的分析、改进建议与阅读心得
    记一次leetcode翻车之路---给自己做个记录
    数据库基础(一)MYSQL
    面试题第1发---记20年某次面试
    go之“hello word”
    利用python简单实现unittest
    web自动化(python)——selenium工具基本使用
    2015最强java开源oa源码
  • 原文地址:https://www.cnblogs.com/yeteng/p/11337763.html
Copyright © 2011-2022 走看看