分享

python必掌握库:pymongo库的心你懂吗?

 liqualife 2019-09-18

前言:

工欲善其事必先利其器,用pymongo库之前,大家需首先对MongoDB数据库的增删改查操作有一些基础方法的了解。

我们在这里使用linux上的ipython交互环境来pymongo库的知识点系统性讲解。

一:如何用python连接MongoDB数据库?

1.1、使用MongoClient()方法建立连接

import pandas as pd
from pymongo import MongoClient
#实例化client,建立连接
client = MongoClient(host='localhost', port=27017)
collection = MongoClient('',27017)['predict_monogo']['t_third_data']

host:指定地址 localhost:XXX.XX.X.XXX

port:指定端口 27017

把创立好的MongoDB的连接对象赋值为client

1.2、使用URL建立连接

另外MongoClient的第一个参数host还可以直接传MongoDB的连接字符串,以mongodb开头,例如:

client = MongoClient('mongodb://localhost:27017/')

1.3 指定数据库

MongoDB中有许许多多个生产库,我们需要指定具体操作的数据库。

我们调用client的test属性即可返回test数据库

db = client.test

或者

db = client['test']

1.4 指定集合

MongoDB的每个数据库又包含了许多集合Collection,也就类似与关系型数据库中的表,用show tables命令可以查看数据库中的各个集合名称。下一步我们需要指定要操作的集合,在这里我们指定一个集合名称为mygirlfriend(女朋友集合),指定集合也有两种方式。

指定集合方式1

collection = db.mygirlfriend

指定集合方式2

collection = db['mygirlfriend']

二、如何插入数据?

2.1、insert_one()方法插入单条数据

接着,我们来插入数据myboyfriend

#对于myboyfriend这个Collection,我们新建一条男朋友数据,以字典的形式表示:
myboyfriend = {
'id': '001',
'name': 'shuhao',
'age': 24,
'hometown': 'SHENZHEN'
}
result2 = collection.insert_one(myboyfriend)

输出插入的文档对应的 _id 值

insert_one()方法返回InsertOneResult对象,该对象包含inserted_id属性,它是插入文档的id值。(在MongoDB中,每条数据其实都有一个_id属性来唯一标识,如果没有显式指明_id,MongoDB会自动产生一个ObjectId类型的_id属性

2.2、insert_many()方法插入多条数据

#我们可以将数据以列表形式传递即可
mygirlfriend = [
{ 'id': '001', 'name': 'ROSE', 'age': '18', 'hometown': 'beijing' },
{ 'id': '002', 'name': 'ANGELA', 'age': '22', 'hometown': 'SHENZHEN' },
{ 'id': '003', 'name': 'JOSIE', 'age': '24' , 'hometown': 'SHENZHEN'},
{ 'id': '004', 'name': 'CINDY', 'age': '26', 'hometown': 'SHENZHEN' },
{ 'id': '005', 'name': 'SUNNT', 'age': '36' , 'hometown': 'NEWYORK'}
]
result1 = collection.insert_many(mygirlfriend)

输出插入的所有文档对应的 _id 值

print(result1.inserted_ids

insert_many()方法返回InsertManyResult对象,该对象包含inserted_ids属性,该属性保存着所有插入文档的id值。

执行完以上查找,我们可以在命令终端,查看mygirlfriend 数据是否已插入:

db.mygirlfriend.find()

三、如何查询数据?

3.1find_one()方法来查询mygirlfriend集合中的一条数据。

client = MongoClient('XXX.XX.X.XXX',27017)
db=client.test
collection = db.mygirlfriend
x = collection.find_one()
print(x)

接着,我们再来根据指定条件查询细分查询

在这里我们查询name为JOSIE的mygirlfriend集合数据,它的返回结果是字典类型,运行结果:

result = collection.find_one({'name': 'JOSIE'})
print(type(result))
print(result)

_id属性 ObjectId('5c67c624332d6344f9ce55e4')是MongoDB在插入的过程中自动添加的。

我们也可以直接根据ObjectId来查询name为JOSIE的mygirlfriend集合数据,这里需要使用bson库里面的ObjectId。

from bson.objectid import ObjectId
result = collection.find_one({'_id': ObjectId('5c67c624332d6344f9ce55e4')})
print(result)

3.1find()方法来查询mygirlfriend集合中的多条数据。

Ex:在这里查询mygirlfriend集合中的查找hometown为SHENZHEN的数据

results = collection.find({'hometown': 'SHENZHEN'})
print(results)

其返回结果是个Cursor类型!!!(相当于一个生成器)

我们需要把所有的结果遍历取出即可!!!

for result in results:
print(result)

如果要查询查询mygirlfriend集合中年龄大于24的数据要怎么写呢?

#如果要查询年龄大于24的数据,则写法如下:
result1 = collection.find({'age': {'$gt': 24}})
print(result1)

在这里查询的条件键值已经不是单纯的数字了,而是一个字典,其键名为比较符号$gt,意思是大于,键值为24,这样便可以查询出所有年龄大于24的数据。

在这里将比较符号归纳如下表:

符号含义示例
$lt小于{'age': {'$lt': 20}}
$gt大于{'age': {'$gt': 20}}
$lte小于等于{'age': {'$lte': 20}}
$gte大于等于{'age': {'$gte': 20}}
$ne不等于{'age': {'$ne': 20}}
$in在范围内{'age': {'$in': [20, 23]}}
$nin不在范围内{'age': {'$nin': [20, 23]}}

在这里,我们可以把数据转换成pandas的DataFrame的数据格式打印出来。

result2 = pd.DataFrame(list(result1))
print(result2)

四、count()方法计数和sort() 方法排序

4.1 要统计查询结果有多少条数据,可以调用count()方法

如统计所有数据条数:

count = collection.find().count()
print(count)

查询hometown为NEWYORK的数据条数!

count = collection.find({'hometown': 'NEWYORK'}).count()
print(count)

4.2、sort() 方法排序

sort() 方法第一个参数为要排序的字段,第二个字段指定排序规则,1 为升序,-1 为降序,默认为升序。

#排序
mydoc = collection.find().sort('name',1)
for x in mydoc:
print(x)

五、偏移和更新操作

5.1、偏移

在某些情况下我们可能想取某几个元素可以利用skip()方法偏移几个位置。

例如偏移2,就忽略前2个元素,得到第三个及以后的元素。

results = collection.find().sort('name').skip(2)
print([result['name'] for result in results])

5.2、更新操作

5.2.1、 update_one() 方法修改文档中的记录

第一个参数为查询的条件

第二个参数为要修改的字段,需要使用newvalues = { '$set': { 'name': 'baby' } }这样的形式

如果查找到的匹配数据多余一条,则只会修改第一条。

myquery = { 'name': 'SUNNT' }
newvalues = { '$set': { 'name': 'baby' } }
collection.update_one(myquery, newvalues)

输出修改后的集合

for x in collection.find():
print(x)

5.2.2、update_many() 方法修改文档中的记录

更改hometown为以 S 开头的文档数据在mygirlfriend集合为hometown为HONGKONG

 myquery = { 'hometown': { '$regex': '^S' } }
newvalues = { '$set': { 'hometown': 'HONGKONG' } }

x = collection.update_many(myquery, newvalues)

查看数据

更新好了之后,我们再来随意查一条数据

#花式查询
mydoc=collection.find({'hometown':'HONGKONG','name':'ANGELA'})

for x in mydoc:
print(x)

六、如何用pymongo 删除数据?

6.1delete_many()方法删除多条文档

删除所有 hometown字段中以 S 开头的文档:

delete_many()方法第一个参数为查询对象,指定要删除哪些数据

myquery = { 'hometown': {'$regex': '^S'} }
x = collection.delete_many(myquery)
print(x.deleted_count, '个文档已删除')

以 S 开头的文档数据在mygirlfriend集合已经删除了

在这里使用了$regex来指定正则匹配,^S.*代表以S开头的正则表达式,这样就可以查询所有符合该正则的结果。

在这里将一些功能符号再归类如下:

符号含义示例示例含义
$regex匹配正则{'name': {'$regex': '^M.*'}}name以M开头
$exists属性是否存在{'name': {'$exists': True}}name属性存在
$type类型判断{'age': {'$type': 'int'}}age的类型为int
$mod数字模操作{'age': {'$mod': [5, 0]}}年龄模5余0
$text文本查询{'$text': {'$search': 'Mike'}}text类型的属性中包含Mike字符串
$where高级条件查询{'$where': 'obj.fans_count == obj.follows_count'}自身粉丝数等于关注数
这些操作的更详细用法在可以在MongoDB官方文档找到:
docs.mongodb.com/manual

6.2delete_one()方法删除单个文档

以下实例删除 name 字段值为 'ROSE' 的文档:

myquery = { 'name': 'ROSE' }
collection.delete_one(myquery)
# 删除后输出
for x in collection.find():
print(x)

那么如何删除集合中的所有文档呢?

x = collection.delete_many({})
#deleted_count属性获取删除的数据条数
print(x.deleted_count, '个文档已删除')

delete_many()方法如果传入的是一个空的查询对象,则会删除集合中的所有文档:

deleted_count属性获取删除的数据条数

调用db.mygirlfriend.find()方法可以看到数据最后一条数据也被我们删除了,mygirlfriend集合的数据已经被我们删光了。

但是这个时候这个集合还是在的

接着,我们调用collection.drop()方法即可删除集合。

上图可以看到,mygirlfriend集合已经被删除啦!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多