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

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

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 .所以还是把那个前端界面操作好吧。数据库这个还是用来练大数据分析那个手机的吧,和爬虫一起