mongoTemplate 小于等于_数据


前言:

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


mongoTemplate 小于等于_mongodb python 大于_02


或者


db = client['test']


mongoTemplate 小于等于_字段_03


1.4 指定集合

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

指定集合方式1


collection = db.mygirlfriend


mongoTemplate 小于等于_数据库_04


指定集合方式2


collection = db['mygirlfriend']


mongoTemplate 小于等于_数据_05


二、如何插入数据?

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

接着,我们来插入数据myboyfriend


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


mongoTemplate 小于等于_字段_06


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

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


mongoTemplate 小于等于_字段_07


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)


mongoTemplate 小于等于_mongoTemplate 小于等于_08


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


print(result1.inserted_ids


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

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


db.mygirlfriend.find()


mongoTemplate 小于等于_mongodb python 大于_09


三、如何查询数据?

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


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


mongoTemplate 小于等于_字段_10


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

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


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


mongoTemplate 小于等于_mongodb python 大于_11


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

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


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


mongoTemplate 小于等于_字段_12


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

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


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


mongoTemplate 小于等于_数据库_13


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

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


for result in results:
    print(result)


mongoTemplate 小于等于_数据_14


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


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


mongoTemplate 小于等于_数据_15


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


mongoTemplate 小于等于_数据_16


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

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

如统计所有数据条数:


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


mongoTemplate 小于等于_数据_17


查询hometown为NEWYORK的数据条数!


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


mongoTemplate 小于等于_字段_18


4.2、sort() 方法排序

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


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


mongoTemplate 小于等于_字段_19


五、偏移和更新操作

5.1、偏移

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

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


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


mongoTemplate 小于等于_字段_20


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)


mongoTemplate 小于等于_数据_21


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

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


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


mongoTemplate 小于等于_mongodb python 大于_22


查看数据


mongoTemplate 小于等于_数据库_23


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


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

for x in mydoc:
  print(x)


mongoTemplate 小于等于_mongoTemplate 小于等于_24


六、如何用pymongo 删除数据?

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

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

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


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


mongoTemplate 小于等于_mongoTemplate 小于等于_25


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


mongoTemplate 小于等于_字段_26


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

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


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


mongoTemplate 小于等于_mongoTemplate 小于等于_27


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


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


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


mongoTemplate 小于等于_数据_28


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

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


mongoTemplate 小于等于_mongoTemplate 小于等于_29


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


mongoTemplate 小于等于_数据_30


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


mongoTemplate 小于等于_数据_31


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