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.
pymongo collection.save 问题的更多相关文章
- 学习mongo系列(二) 新建数据库,collection ,insert(),save()
一,新建数据库user:use user 二,查看当前使用的数据库:db 三,查看所有数据库:show dbs 四,删除当前正在使用的数据库:db.dropDatabase() 五,在当前数据库中插入 ...
- 关于python中使用mongodb模块,save和insert的小问题
今天写python脚本的时候发现这样一个问题: import os , string , datetime ,pymongo; conn = pymongo.Connection("127. ...
- pymongo连接MongoDB
导语 pymongo 是目前用的相对普遍一个python用来连接MongoDB的库,是工作中各种基本需求都能满足具体api可以参考 pymongo APIpymongo github 安装 Mongo ...
- MongoDB和pymongo的CURD
一.mongodb 1.介绍 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之 ...
- pymongo 使用方法(增删改查)
#!/usr/bin/env python # -*- coding:utf-8 -*- """ MongoDB存储 在这里我们来看一下Python3下MongoDB的存 ...
- pymongo使用手册
MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,它的字段值可以包含其他文档.数组及文档数组,非常灵活.在这一节中,我们就来看 ...
- python操作三大主流数据库(8)python操作mongodb数据库②python使用pymongo操作mongodb的增删改查
python操作mongodb数据库②python使用pymongo操作mongodb的增删改查 文档http://api.mongodb.com/python/current/api/index.h ...
- Python3中PyMongo的用法
MongoDB存储 在这里我们来看一下Python3下MongoDB的存储操作,在本节开始之前请确保你已经安装好了MongoDB并启动了其服务,另外安装好了Python的PyMongo库. 连接Mon ...
- python中使用pymongo操作mongo
MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,它的字段值可以包含其他文档.数组及文档数组,非常灵活.在这一节中,我们就来看 ...
随机推荐
- 自制无线共享工具C++源代码及创建过程
// wire.cpp : 定义控制台应用程序的入口点.// #include <iostream>#include <string.h>using namespace std ...
- Android(java)学习笔记192:ContentProvider使用之虚拟短信
1.虚拟短信应用场景: 急着脱身?应付老婆(老公.男女朋友查岗)? 使用虚拟通话短信吧.您只需通过简单设置,软件就会在指定时间会模拟一个“真实”来电或短信来迷惑对方,通过“真实”的证据让对方相 ...
- Spring Cloud练习1
pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
- django 标签
django标签 {% if/for/ifequal/ifnotequal condition %} ...{{ name|first|lower}}{# interpretation:lower t ...
- Elasticsearch入门和基本使用
1. 什么是Elasticsearch? Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统:Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开 ...
- JS、CSS、Image预加载
Image预加载 <div class="hidden"> <script type="text/javascript"> var im ...
- [Python3网络爬虫开发实战] 6-Ajax数据爬取
有时候我们在用requests抓取页面的时候,得到的结果可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据,但是使用requests得到的结果并没有.这是因为requests获取的都是 ...
- php-fpm进程数管理
PHP-FPM 先来了解一些名词概念: CGI是Common Gateway Interface(通用网管协议),用于让交互程序和Web服务器通信的协议.它负责处理URL的请求,启动一个进程,将客户端 ...
- Hadoop-2.7.1伪分布--安装配置hbase 1.1.2
hbase-1.1.2下载地址:http://www.eu.apache.org/dist/hbase/stable/hbase-1.1.2-bin.tar.gz 下载之后解压至\usr\local目 ...
- PHP 反射API
出处:http://blog.csdn.net/hguisu/article/details/7357421 PHP5添加了一项新的功能:Reflection.这个功能使得phper可以reverse ...