mongodb python 大于_python必掌握库:pymongo库的心你懂吗?

d9c3d48efa9f0f6df462d40da156d6cc.png

前言:

工欲善其事必先利其器,用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

43b02b7f5933d34391bcfd3449effaf1.png

或者

db = client['test']

71a4ddedb2ff8576b60d40cda0856adc.png

1.4 指定集合

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

指定集合方式1

collection = db.mygirlfriend

f2f98b1d7799c4f63f335ee82c61d461.png

指定集合方式2

collection = db['mygirlfriend']

83c4649b7046c90ce62bb012a44f37c9.png

二、如何插入数据?

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

接着,我们来插入数据myboyfriend

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

39cad18b2aa6bf7dc46844d6dc0c9295.png

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

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

ce57322e39d57c1ec8231eb0bc6e1636.png

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)

6d5232d5636366bcaa61ca30db0bc902.png

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

print(result1.inserted_ids

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

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

db.mygirlfriend.find()

a03224d8fca759da20cffcad7703c3bb.png

三、如何查询数据?

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

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

2bbd5fb1053e247d67144a8464cd5134.png

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

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

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

9cd00e8bc1c14391824ac3ba3284f89b.png

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

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

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

75648d285bbaeedf7a1f5fe65e99a965.png

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

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

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

3c9da0816062dc35661a624b6ef2a37b.png

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

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

for result in results:
    print(result)

4d2ee4e33d8e1a0ecfc62c18d3253cca.png

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

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

f67e4e9bda018df7df83e6eba1845e17.png

在这里查询的条件键值已经不是单纯的数字了,而是一个字典,其键名为比较符号$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)

7da4c4659329af7ddf3a25e89b25887a.png

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

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

如统计所有数据条数:

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

f06e139706ff2cbe438bed065d3afb00.png

查询hometown为NEWYORK的数据条数!

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

25e88a9291775ab8e08dfa07d63a007c.png

4.2、sort() 方法排序

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

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

c76a9bf5894a32a63d5a6096d35dc4f6.png

五、偏移和更新操作

5.1、偏移

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

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

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

41155c717ea9cf90bfd309ba331aa682.png

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)
  

5e42590e7678a41bf6f34cbedfa2220d.png

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

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

 myquery = { "hometown": { "$regex": "^S" } }
newvalues = { "$set": { "hometown": "HONGKONG" } }
 
x = collection.update_many(myquery, newvalues)

95d6b473e6c65563190ab1241c38e748.png

查看数据

8b5403a9da532fa4529354cba1565d41.png

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

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

for x in mydoc:
  print(x)

9197ee16f42ef564597e26958641ff94.png

六、如何用pymongo 删除数据?

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

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

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

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

dda6be148023a5851462314c3271a2da.png

以 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/

04efc90dbfb7b433eef76ad506ac9683.png

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

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

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

fa16196fe9f6ba946132d738137ac552.png

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

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

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

826f3bad47d4dd2362225c7f742271dd.png

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

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

0e21d2617452810b7844f9f5791d2778.png

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

58e1096bd5b83def419dd482dc9de86c.png

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

a9d80a03d4f9d8b83713370d43cca73f.png

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

往期精彩回顾第一篇 | 深圳购房投资笔记(一)-楼市有泡沫吗?(上)第二篇 |深圳购房投资笔记(二)-楼市有泡沫吗?(中)第三篇|深圳购房笔记(三)-亲身经历货币棚改化(上)第四篇|深圳购房投资笔记(四)-亲身经历货币化棚改(下)第五篇|深圳购房投资笔记(五)-因为朋友,被杭州所迷惑第六篇|深圳购房投资笔记(六)-为何放弃在杭州定居购房第七篇|深圳购房投资笔记(七)-神奇的深圳人口?(下)第八篇|深圳购房投资笔记(八)-为何选择在深圳定居购房?第九篇|深圳购房投资笔记(九)-中国最大的炒房散户欧成效先生第十篇|深圳购房投资笔记(十)-深圳楼市拐点已来临第十一篇|深圳购房投资笔记(十一)-楼市谣言四处飞,我向人民说实话(上)第十二篇|深圳购房投资笔记(十二)-楼市谣言四处飞,我想人民说实话(下)第十三篇|深圳购房投资笔记(十三)-民间炒房高手财上团(上)第十四篇|深圳购房投资笔记(十四)-2019年的这一切都是必然的第十五篇|深圳购房投资笔记(十五)-2019年我们的处境深圳购房投资笔记(十六)从19年看李嘉诚为何资产

b99565f26338a56c8a3f5742a06cd303.png

图片笔者摄于2018年10月7日07:31分,于福建省武夷山坐竹筏途中。江雾和晨曦的阳光打在脸上给人兴奋的心情!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值