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.
原文地址:https://www.cnblogs.com/kramer/p/5074080.html