zoukankan      html  css  js  c++  java
  • pymongo collection.save 问题

    项目中有这样一个需求,把路由器信息存入mongo,DB的结构如下:

        {
            router_name: name,
            router_ip: ip,
            interfaces: [
                        {oid:1,name:if1},
                        {oid:2,name:if2},
                        {oid:3,name:if3},
                        {oid:4,name:if4}
                    
                    ]
        }
    
    

    简单的说 router 是一个document , 它有一个interfaces属性,其值为一个列表,列表中是多个字典,每个字典是一个interface。
    存放router的collection 叫做 device_collection

    那么在添加interface的时候我是这么做的:

    router = device_collection.find_one({ip: 10.0.0.1})
    router[interfaces].append( interface_oid)
    device_collection.save(router)
    

    看似没问题,但是这是一个很严重的错误!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1

    因为, 在save 之前, router这个对象是在你程序的内存中的。 这个时候如果有人修改了这个router的对象,那么你接下来的save就会覆盖那个人的修改!!!!!!!!

    之前的做法是调用数据库自己的update 方法,数据库自己的update方法会有一个并发校验的过程。在你提交update请求前的极限时间点和你update后的极限时间点之间是不会有人修改的。

    比如可以这么做

    devices_collection.update({'ip': router_ip},{'$addToSet':{'interfaces':interface_obj}},multi=True)
    

    addToSet的官方解释

       The $addToSet operator adds a value to an array unless the value is already present, in which case $addToSet does nothing to that array.
  • 相关阅读:
    PL/pgSQL的RETURN QUERY例子
    PL/pgSQL的 RETURN NEXT例子
    PL/pgSQL学习笔记之二
    基于React的PC网站前端架构分析
    DialogFragment创建默认dialog
    一个RecycleView的强大adapter
    企业者的福音之8266接入阿里智能,点亮一盏灯。
    基于webmagic的种子网站爬取
    自上而下渐显图片的CSS3实现
    用SwiftGen管理UIImage等的String-based接口
  • 原文地址:https://www.cnblogs.com/kramer/p/5074080.html
Copyright © 2011-2022 走看看