坑--一次插入数据导致的坑

1 .mongodb的key是不能包括“.”的,字符串还可以解决,但是如果key是一个数字的话怎么搞

  re=[]
    for i in range(2):
        cell={}
//新建一个对象,可能在这个循环里面给这个dict加一些数据
        for y in range(2):
            cell['name']='libatere'
            cell['url']=url
            cell['shName']='234'
            cell['i']=i
            cell['y']=y
            re.append(cell)
    return re
//结果:插入数据库的时候提示有重复的object id

2 .object id 重复 for 循环insert数据的时候

object id的构成

1 .前四个字节:时间戳,表示创建时间
2 .之后的三个:机器识别符,保证不同主机产生不同的objectid 值
3 .之后的两个:进程id,保证同一主机下不同mongodb进程产生不同的objectid值
4 .之后的三个:自增计数器:保证同一主机,同一进程,同意秒内产生的object id的唯一性
5 .object id近似唯一:理论上会出现很小概率的(1/(2^24-1)的重复情况)
6 .c#官方驱动,构成Objectid的计数器,实行的是上述的生成id的规则
7 .有的版本的驱动是以随机数作为计数器,这种情况并不能保证生成的id是唯一的

分析原理

1 .这个for循环的cell在第一个for里面或者最上面,虽然插入的值是不一样的,但是是用id()方法,发现里面的内存地址是一样,而pymongo的源码里面插入的时候会检查id


image.png

2 .上面错误代码打印的id()


image.png

3 .可以看到虽然4个dict内容都不一样,但是打印他们的id(),发现有两个是完全一样的。而且还不会解耦,这个特性还会带入到下一个for循环的操作中。

总结

1 .多个循环处理或者生成一个dict的时候,一定要在最后一个for里面进行装填,这样才能导致每次都是创建的全新的dict
2 .这个到底是否适合存到数据库里面,原来是一个全局搜索excel里面数据的操作,现在要做成一个把这个excel里面的数据整理,然后插入数据库,在数据库里面进行全文搜索,但是存到数据库里面的话才发现每一组数据的key是汉字,这个用python2.7的时候有点麻烦,而且数据库里面数据的key是汉字感觉很奇怪,而且这个全文搜索的时候,导致的用两套语法,一边用mongo shell ,一边用python.这么小的一个功能到底值不值得这么复杂的操作。而且这个还会涉及换表,更新表,删除表。其后的所有操作都是需要操作数据库的,还需要一个diff excel的工具
3 .初衷就是熟悉python操作excel的方法
4 .所以还是把那个前端界面操作好吧。数据库这个还是用来练大数据分析那个手机的吧,和爬虫一起

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,167评论 2 89
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,024评论 19 139
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,970评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,878评论 1 32
  • 中国的古典文化,堪称国粹。为了弘扬中国古典之美,我们9.1班也兴致高昂地 加入了颂读经典的行列。看,孩子们在积极的...
    玉晓君阅读 2,976评论 0 0

友情链接更多精彩内容