作者:Zarten知乎专栏:Python爬虫深入详解知乎ID: Zarten简介: 互联网一线工作者,尊重原创并欢迎评论留言指出不足之处,也希望多些关注和点赞是给作者最好的鼓励 !

介绍

MongoDB是一种面向文档型的非关系型数据库(NoSQL),由C++编写。非关系数据库中是以键值对存储,结构不固定,易存储,减少时间和空间的开销。文档型数据库通常是以JSON或XML格式存储数据,而Mongodb使用的数据结构是BSON(二进制JSON),和JSON相比,BSON提高了存储和扫描效率,但空间占用会更多一些。

在python中操作MongoDB,我们使用PyMongo,下面着重介绍。

PyMongo的使用

前提:安装了MongoDB服务器,若没有,点击这里安装

1.安装

pip3 install pymongo

2.连接

  • 第1种方式:
#无密码连接
import pymongo
mongo_client = pymongo.MongoClient('127.0.0.1', 27017)#有密码连接
import pymongo
mongo_client = pymongo.MongoClient('127.0.0.1', 26666)
mongo_auth = mongo_client.admin #或 mongo_client['admin'] admin为authenticationDatabase
mongo_auth.authenticate('用户名', '密码')

  • 第2种方式:
#无密码连接
import pymongo
mongo_client = pymongo.MongoClient('mongodb://127.0.0.1:27017')#有密码连接
import pymongo
import urllib.parse
mongo_username = urllib.parse.quote_plus('你的用户名')
mongo_password = urllib.parse.quote_plus('密码')
mongo_client = pymongo.MongoClient('mongodb://%s:%s@127.0.0.1:26666' % (mongo_username, mongo_password))
print(mongo_client.server_info()) #判断是否连接成功

判断是否连接成功:

print(mongo_client.server_info()) #判断是否连接成功

3.获取Database 和 Collection

若没有Database 和Collection,则会自动创建

第一种方式:

mongo_db = mongo_client['你的database']
mongo_collection = mongo_db['你的collection']

第二种方式:

mongo_db = mongo_client.你的database
mongo_collection = mongo_db.你的collection

CURD操作

4.插入单条数据 insert_one()

insert_one() 详细说明参考

import datetime
info = {'name' : 'Zarten','text' : 'Inserting a Document','tags' : ['a', 'b', 'c'],'date' : datetime.datetime.now()
}
mongo_collection.insert_one(info)

5.插入多条数据 insert_many()

insert_many() 详细说明参考

import datetime
info_1 = {'name' : 'Zarten_1','text' : 'Inserting a Document','tags' : ['a', 'b', 'c'],'date' : datetime.datetime.now()
}info_2 = {'name' : 'Zarten_2','text' : 'Inserting a Document','tags' : [1, 2, 3],'date' : datetime.datetime.now()
}insert_list = [info_1, info_2]
mongo_collection.insert_many(insert_list)

6.插入字符串类型的时间

由上图可以看到插入字符串时间时,mongodb自动转成了 ISOdate类型,若需要时间在mongdb也是字符串类型,只需这样操作即可

datetime.datetime.now().isoformat()

7.删除一条数据 delete_one()

delete_one() 详细说明参考

删除一条数据。若删除条件相同匹配到多条数据,默认删除第一条

删除前的数据如下:

mongo_collection.delete_one({'text' : 'a'})

删除后的数据如下:

8.删除多条数据 delete_many()

delete_many() 详细说明参考

删除满足条件的所有数据

删除前的数据如下:

mongo_collection.delete_many({'text' : 'a'})

删除后的数据如下:

9.更新单条数据 update_one()

update_one() 详细说明参考

只会更新满足条件的第一条数据

update_one(filter,update,upsert=False,bypass_document_validation=False,collation=None,array_filters=None,session=None)

  • 第一个参数 filter:更新的条件
  • 第二个参数 update : 更新的内容,必须用$操作符
  • 第三个参数 upsert : 默认False。若为True,更新条件没找到,则插入更新的内容

更新前的数据如下:

info = {'name': '桃子 ','text': 'peach','tags': [1, 2, 3],'date': datetime.datetime.now()}
update_condition = {'name' : 'Zarten_2'} #更新的条件,也可以为多个条件
#更新条件多个时,需要同时满足时才会更新
# update_condition = {'name' : 'Pear',
#                     'text' : '梨子'}mongo_collection.update_one(update_condition, {'$set' : info})

更新后的数据:

10.更新多条数据 update_many()

update_many() 详细说明参考

更新满足条件的所有数据

更新前的数据如下:

info = {'name': 'Zarten','text': 'a','tags': [1, 2, 3],'date': datetime.datetime.now()}
update_condition = {'text' : 'a'} #更新的条件
#更新条件多个时,需要同时满足时才会更新
# update_condition = {'name' : 'Pear',
#                     'text' : '梨子'}mongo_collection.update_many(update_condition, {'$set' : info})

11.更新时,若无满足条件,则插入数据

update_one() 详细说明参考

通过设置upsert为True即可

更新前的数据如下:

info = {'name': 'Banana','text': '香蕉','tags': [1, 2, 3],'date': datetime.datetime.now()
}
update_condition = {'text' : 'a'} #更新的条件
#更新条件多个时,需要同时满足时才会更新
# update_condition = {'name' : 'Pear',
#                     'text' : '梨子'}mongo_collection.update_many(update_condition, {'$set' : info}, upsert= True)

更新后的数据如下:

12.查询一条数据 find_one()

find_one() 详细说明

匹配第一条满足的条件的结果,这条结果以dict字典形式返回,若没有查询到,则返回None

find_condition = {'name' : 'Banana','text' : 'peach'
}
find_result = mongo_collection.find_one(find_condition)

可以通过projection参数来指定需要查询的字段,包括是否显示 _id ,更多具体用法参考 find()

find_condition = {'name' : 'Zarten_3',
}
select_item = mongo_collection.find_one(find_condition, projection= {'_id':False, 'name':True, 'num':True})
print(select_item)

13.查询范围

查询范围具体参考这里

范围查询通常用$ 例如:$gte 大于等于 $lt 小于;具体的$符号在文章末尾查看

例如:查询一段时间内的数据

import datetime
find_condition = {'date' : {'$gte':datetime.datetime(2018,12,1), '$lt':datetime.datetime(2018,12,3)}
}
select_item = mongo_collection.find_one(find_condition)
print(select_item)

14.查询多条数据 find()

find() 详细说明

返回满足条件的所有结果,返回类型为 Cursor ,通过迭代获取每个查询结果,每个结果类型为dict字典

find_condition = {'name' : 'Banana','text' : '香蕉'
}
find_result_cursor = mongo_collection.find(find_condition)
for find_result in find_result_cursor:print(find_result)

15.通过 _id 来查询

查询条件中_id 类型是ObjectId类型,也就是插入时返回的对象。

若 _id 提供的是str类型的,我们需要转成ObjectId类型

from bson.objectid import ObjectId
query_id_str = '5c00f60b20b531196c02d657'
find_condition = {'_id' : ObjectId(query_id_str),
}
find_result = mongo_collection.find_one(find_condition)
print(find_result)

16.查询一条数据同时删除 find_one_and_delete()

find_one_and_delete(filter,projection=None,sort=None,session=None,**kwargs) 详细说明

  • filter:查询条件
  • projection:选择返回和不返回的字段
  • sort:list类型,当查询匹配到多条数据时,根据某个条件排序,函数返回时返回第一条数据

只能返回一条数据

此函数的特别之处在于,它会返回被删除的信息,以字典dict形式返回

删除前的数据:

17.查询并删除,匹配单条数据

find_condition = {'name' : 'Banana',
}
deleted_item = mongo_collection.find_one_and_delete(find_condition)
print(deleted_item)

18.查询并删除,匹配多条数据,有选择的返回某条数据

通过sort参数

find_condition = {'name' : 'Zarten_2',
}
deleted_item = mongo_collection.find_one_and_delete(find_condition, sort= [('num', pymongo.DESCENDING)])
print(deleted_item)

删除后的数据:

19.计数

count_documents() 详细说明

注意:此函数在3.7版本添加,以下的版本无法使用,本人版本为3.6.3 固无法使用

find_condition = {'name' : 'Zarten_1'
}
select_count = mongo_collection.count_documents(find_condition)
print(select_count)

20.创建索引 create_index()

create_index() 详细说明

插入数据时,已经有一个_id索引了,我们还可以自定义创建索引

参数 unique设置为True时,创建一个唯一索引,索引字段插入相同值时会自动报错。默认为False,为False时可以插入相同值

mongo_collection.create_index('name', unique= True)

21.获取索引信息

list_indexes() 和 index_information() 详细说明参考这里

# list_indexs = mongo_collection.list_indexes()
# for index in list_indexs:
#     print(index)index_info = mongo_collection.index_information()
print(index_info)

由上图可以看到:

索引的名称自动作了处理,变成了别名 name_1

22.删除索引 drop_index() 和 drop_indexes()

详细参考这里

需要使用索引的别名,没有则抛出错误

del_index = mongo_collection.drop_index('name_1')
print(del_index)

23.删除集合 drop()

mongo_collection.drop()

24.符号$参考表

Pymongo常用操作

  • 根据_id查询数据插入时间排序
col.find().sort('_id',-1) #根据插入时间降序

  • 根据_id查询某个日期插入的数据

比如查询今天插入的所有数据

import datetime
from bson.objectid import ObjectIdtoday_zero = datetime.datetime.strptime(datetime.datetime.now().strftime("%Y-%m-%d"), "%Y-%m-%d")
dummy_id = ObjectId.from_datetime(today_zero)
results = col.find({"_id": {"$gte": dummy_id}}).limit(10)
for result in results:print(result)

比如查询15天前的那天日期的所有插入数据

import datetime
from bson.objectid import ObjectIdstart_day_time = datetime.datetime.today() - datetime.timedelta(15)
end_day_time = datetime.datetime.today() - datetime.timedelta(14)start_day_zero = datetime.datetime.strptime(start_day_time.strftime("%Y-%m-%d"), "%Y-%m-%d")
end_day_zero = datetime.datetime.strptime(end_day_time.strftime("%Y-%m-%d"), "%Y-%m-%d")start_dummy_id = ObjectId.from_datetime(start_day_zero)
end_dummy_id = ObjectId.from_datetime(end_day_zero)results_count = col.find({"_id": {"$gte": start_dummy_id,"$lte":end_dummy_id}}).count()
print(results_count)

比如昨天插入数据

start_day_time = datetime.datetime.today() - datetime.timedelta(1)
end_day_time = datetime.datetime.today() - datetime.timedelta(0)start_day_zero = datetime.datetime.strptime(start_day_time.strftime("%Y-%m-%d"), "%Y-%m-%d")
end_day_zero = datetime.datetime.strptime(end_day_time.strftime("%Y-%m-%d"), "%Y-%m-%d")start_dummy_id = ObjectId.from_datetime(start_day_zero)
end_dummy_id = ObjectId.from_datetime(end_day_zero)results_count = col.find({"_id": {"$gte": start_dummy_id,"$lte":end_dummy_id}}).count()print(results_count)

mongodb创建用户名和密码_Python中使用MongoDB详解相关推荐

  1. python中threading模块_python中threading模块详解

    python中threading模块详解,threading提供了一个比thread模块更高层的API来提供线程的并发性.这些线程并发运行并共享内存. 下面来看threading模块的具体用法: 一. ...

  2. mongodb创建用户名和密码_mongodb用studio3T进行数据备份和用户的创建

    首先,如果用yum安装mongodb数据库的话,后期是无法使用自带mongodump工具进行导入导出的,另外MongoDB Compass工具无法整个库导出,很不方便,这里就会用到一个mongodb很 ...

  3. java判断或_Java判断用户名和密码是否符合要求过程详解

    这篇文章主要介绍了Java判断用户名和密码过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 假设在某仓库管理系统的登录界面中需要输入用户名和密 ...

  4. python数据结构包括什么_Python中的数据结构详解

    概述 在深入研究数据科学和模型构建之前,Python中的数据结构是一个需要学习的关键内容 了解Python提供的不同数据结构,包括列表.元组等 介绍 数据结构听起来是一个非常直截了当的话题,但许多数据 ...

  5. python os 常用方法_python中os常用方法详解

    os的官方解释 os os: This module provides a portable way of using operating system dependent functionality ...

  6. python中socket模块常用吗_python中socket模块详解

    socket模块简介 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket.socket通常被叫做"套接字",用于描述IP地址和端口,是一个通信 ...

  7. python模块讲解_python中常用模块详解一

    1.time 模块 import time s = time.localtime() # 把时间转化成格式化的时间,通过. 取得里面的年月日等 struct_time 格式 time.struct_t ...

  8. python中的类及self详解_python中的self详解与对照与网站分享

    接触Python以来,看到类里的函数要带个self参数,一直搞不懂啥麻子原因.晚上特别针对Python的self查了一下,理理. Python要self的理由 Python的类的方法和普通的函数有一个 ...

  9. enumerate在python中的意思_Python中enumerate用法详解

    enumerate()是python的内置函数.适用于python2.x和python3.x enumerate在字典上是枚举.列举的意思 enumerate参数为可遍历/可迭代的对象(如列表.字符串 ...

最新文章

  1. R语言使用ggplot2包使用geom_violin函数绘制分组小提琴图(配置填充色)实战
  2. 【图灵】iOS技能书单——入门+进阶+精通
  3. hadoop-hdfs-ha配置-搭建
  4. TensorFlow函数(十)tf.global_variables_initializer()
  5. 数据科学近3年都应用在哪些领域?
  6. python 读取远程服务器文件
  7. 网络安全学习相关网站
  8. 【基于UML软件建模的选课系统】
  9. 查看本地MSN帐号和密码
  10. Mac苹果电脑上右键创建文件
  11. 捷径 播报日期、时间、星期
  12. 30个Eclipse键盘快捷键大全,让你工作效率翻倍
  13. graphs菜单_spss菜单栏中英文对照.ppt
  14. 用MATLAB求序列反折
  15. MySQL报错:Duplicate entry ‘xxx‘ for key ‘xxx‘
  16. 立创商城的元件原理图怎么弄到ad_立创EDA元件封装导入AD软件教程
  17. iOS10后友盟推送报错,在iOS9设备上获取到device_token但接不到推送消息,iOS10上报错code=3000
  18. 激活函数activation总结
  19. 读 Flink 源码,肝进阿里云 Flink 组了。。
  20. 【转】2008年.Net编程人员工具参照

热门文章

  1. 漫画| 一图带你看懂云原生
  2. 别琢磨了,七夕礼物都给你想好了
  3. 深入解读无服务器架构下的数据库
  4. 这一次,腾讯用AI让手语“发声”
  5. PMP之项目相关方管理
  6. NodeJS使用ES6
  7. Unsupported Hardware Detected
  8. mybatis实现CRUD(不使用DAO)
  9. JAVA程序设计----集合基础之Collection
  10. PAT1061 判断题 (15 分)