项目中有这样一个需求,把路由器信息存入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.

pymongo collection.save 问题的更多相关文章

  1. 学习mongo系列(二) 新建数据库,collection ,insert(),save()

    一,新建数据库user:use user 二,查看当前使用的数据库:db 三,查看所有数据库:show dbs 四,删除当前正在使用的数据库:db.dropDatabase() 五,在当前数据库中插入 ...

  2. 关于python中使用mongodb模块,save和insert的小问题

    今天写python脚本的时候发现这样一个问题: import os , string , datetime ,pymongo; conn = pymongo.Connection("127. ...

  3. pymongo连接MongoDB

    导语 pymongo 是目前用的相对普遍一个python用来连接MongoDB的库,是工作中各种基本需求都能满足具体api可以参考 pymongo APIpymongo github 安装 Mongo ...

  4. MongoDB和pymongo的CURD

    一.mongodb 1.介绍 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之 ...

  5. pymongo 使用方法(增删改查)

    #!/usr/bin/env python # -*- coding:utf-8 -*- """ MongoDB存储 在这里我们来看一下Python3下MongoDB的存 ...

  6. pymongo使用手册

    MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,它的字段值可以包含其他文档.数组及文档数组,非常灵活.在这一节中,我们就来看 ...

  7. python操作三大主流数据库(8)python操作mongodb数据库②python使用pymongo操作mongodb的增删改查

    python操作mongodb数据库②python使用pymongo操作mongodb的增删改查 文档http://api.mongodb.com/python/current/api/index.h ...

  8. Python3中PyMongo的用法

    MongoDB存储 在这里我们来看一下Python3下MongoDB的存储操作,在本节开始之前请确保你已经安装好了MongoDB并启动了其服务,另外安装好了Python的PyMongo库. 连接Mon ...

  9. python中使用pymongo操作mongo

    MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,它的字段值可以包含其他文档.数组及文档数组,非常灵活.在这一节中,我们就来看 ...

随机推荐

  1. Xcode 9 打印信息解决

    Xcode 9 打印信息解决 打印信息 1 nw_proxy_resolver_create_parsed_array PAC evaluation error: kCFErrorDomainCFNe ...

  2. web页面打印--铺满A4

    css <style type="text/css"> body { margin: 0; padding: 0; background-color: #FAFAFA; ...

  3. 如何用 CSS 绘制各种形状

    自适应的椭圆 1.自适应的椭圆 实现方式是通过border-radius这个属性:border-radius它可以单独指定水平和垂直半径.用 / 分隔这两个值.并且该属性的值不仅可以接受长度值,还能接 ...

  4. Bash Template

    #/bin/bash #set -x set -e usage() { cat <<EOF Usage: `basename $` [OPTIONS] <non-option arg ...

  5. .Net Core 真能令微软的.Net 跨平台“蔓延”?

    什么是.Net .Net 本身就是基于公共语言基础架构(CLI)实现的平台独立的公共语言开发平台,只是自2006年成为规范以来的CLI,只有Windows自己支持罢了(mono除外).微软的.Net ...

  6. B3. Cocurrent 线程的状态

    [概述] 1). java.lang.Thread 类中定义了一个枚举 State, 定义了线程的六种状态:NEW.RUNNABLE.BLOCKED.WAITING.TIMED_WAITING.TER ...

  7. while(n--)

    while(n--)的意思:先判断n是否等于0,如果等于0,就不循环.如果不等于0,就进入循环,同时n的值减1.一直等到n=0才退出while循环. C语言.C++

  8. [0] Hello World

    受不了CSDN了,广告多,慢,编辑器难用,还限制博客数量.

  9. nohup 忽略所有挂断信号

    1.nohup 用途:不挂断地运行命令. 语法:nohup Command [ Arg … ] [ & ] 无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup ...

  10. c++基础_特殊回文数

    #include <iostream> using namespace std; int main(){ int n; cin>>n; ;i<;i++){ int tem ...