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.
  • 相关阅读:
    iOS离屏渲染简书
    iOS Waxpatch项目(动态更新)
    waxpatch修改任意类的用法
    ios waxpatch lua语法
    ios WaxPatch热更新原理
    WaxPatch中demo注意问题
    ios wax热更新之安装wax(xcode7.3.1)
    获取第三方键盘高度(包括自带键盘高度)
    25个增强iOS应用程序性能的提示和技巧(高级篇)(2)
    JS基础_一元运算符
  • 原文地址:https://www.cnblogs.com/kramer/p/5074080.html
Copyright © 2011-2022 走看看