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}}) 

 

posted @ 2021-04-18 02:21  shang的学习园地  阅读(289)  评论(0)    收藏  举报