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
  • 相关阅读:
    Goahead在linux环境下安装部署
    vim卡住怎么办
    Clickhouse 实现 row number功能
    JavaScript ES6 模块化
    MySQL012事务的四个基本特征是什么
    MySQL015简述mysql中索引类型有哪些,以及对数据库的性能的影响
    MySQL010MySQL执行计划怎么看
    JavaScript ES6 Promise
    MySQL011如何处理MySQL的慢查询
    MySQL009MySQL为什么需要主从复制和读写分离
  • 原文地址:https://www.cnblogs.com/yeteng/p/11337763.html
Copyright © 2011-2022 走看看