前言:
工欲善其事必先利其器,用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:http://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官方文档找到:https://docs.mongodb.com/manual/reference/operator/query/
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集合已经被删除啦!