pymongo操作
安装mongoDB:直接下载安装,软件会自动配置,安装后查看服务中有mongoDB即可。
安装pymongo:pip install pymongo
连接本地客户端:
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
连接/创建数据库:
mydb = myclient["industrial"]
连接/创建集合(相当于sql中的表):
mycol=mydb['MA']
注意:必须存入数据,集合才会被创建;
表名不能有'.',第一个字符不能是数字。
存入数据:
district_futian={'城市':'深圳','行政区':'福田'}
district_list=[district_futian,district_nanshan,district_baoan]
mycol.insert_many(district_list)
mycol.insert_one(district_futian)
不要用insert。
mongo会自动给每一条数据添加一个_id
添加新数据会自动放到集合的末尾
读取最好设置_id为False,因为_id的值不是字符串,直接使用会出错。
_id问题:
由mongoDB自动生成的唯一id,是一个ObjectId对象
'_id': ObjectId('607d469f23bb39b21499fc84')
生成规则:
607d469f:时间戳
23bb39b214:随机数
99fc84:计数器(随机数)
但不保证一定按顺序:
While ObjectId values should increase over time, they are not necessarily monotonic. This is because they:
- Only contain one second of temporal resolution, so ObjectId values created within the same second do not have a guaranteed ordering, and
- Are generated by clients, which may have differing system clocks.
因为时间是按秒计的,同一秒内的数据不一定是正确的顺序,且各客户端的时钟可能不同
_id转为datetime对象:
data=mycol.find_one()
time=data['_id'].generation_time
print(data['_id'])
print(time)
607880e2ddf9ea6bf7fb4232
2021-04-15 18:07:30+00:00
按datetime查询:
>>> gen_time = datetime.datetime(2010, 1, 1) >>> dummy_id = ObjectId.from_datetime(gen_time) >>> result = collection.find({"_id": {"$lt": dummy_id}})
_id转为字符串:
data=mycol.find_one() id_=data['_id'] id_str=str(id_) print(id_str)
607880e2ddf9ea6bf7fb4232
查询:
基本查询语法:
query={} #查询条件
fields={'_id':0} #查询字段,True和False,0和1都可以
mycol.find(query,fields)
查询结果可直接转为列表:
data=mycol.find(query,fields)
data=list(data)
超时:cursor默认有效时间为10分钟,超时会废弃,出现CursorNotFound error,可以设置为不限时。
cursor=mycol.find({},fields,no_cursor_timeout=True, batch_size=5)
排序(1为升序,-1为降序):
mycol.find({},fields).sort([('date',1)]):
取得的数据就是已经排好序的。
单个数据排序(用来取最近或最早的一条数据):
last=mycol.find_one(sort=[('date',-1)])
last=mycol.find_one(sort=[('_id',-1)])
-1就是降序,取最近的一条数据。
一般可以用_id排序,因为_id本身就有顺序
(即使fields中已设置_id为False,sort中也可以用_id排序)
跳过前面的100条数据:
mycol.find({},fields).skip(100):
限制取前面的100条数据:
mycol.find({},fields).limit(100):
sort、skip、limit一起使用,优先级:sort>skip>limit
条件查询:
查询匹配的数据:
query={'code':'600000'}
mycol.find(query,fields)
注意find只接受两个参数,否则出错:TypeError: skip must be an instance of int
查询指令包含逻辑指令:
query={ '$and':[{'code':'600000'},{'date':'2020-01-01'}], '$or':[{'code':'600000'},{'code':'600001'}]) } mycol.find(query,fields)
接收的条件是列表:
code_range=['300302','300770'] query={ '$or':[{'code':x} for x in code_range]
}
条件可以嵌套:
query={ '$and':[ {'$or':[{'secCode':x} for x in code_range]},
{'$or':[{'pageColumn':x} for x in market))}
]
}
mycol.find(query,fields)
计算查询结果的数量:
早期的版本用count(),现在用count_documents(),count_documents()是集合的方法,要传入过滤参数
query={'code':col['_id'],'month':col['month'][0]}
mycol.count_documents(query)
删除文档:
mycol.delete_one(query)
mycol.delete_many(query)
更新:
增加字段:mycol.update({"_id":1},{"$set":{"new_field":0}})
删除字段:mycol.update({"_id":1},{"$unset":{"new_field":1}})
浙公网安备 33010602011771号