基于菜鸟教程实际操作后总结而来

Python MongoDB

MongoDB 是目前最流行的 NoSQL 数据库之一,使用的数据类型 BSON(类似 JSON)。

MongoDB 数据库安装与介绍可以查看我们的 MongoDB 教程。


PyMongo

Python 要连接 MongoDB 需要 MongoDB 驱动,这里我们使用 PyMongo 驱动来连接。

pip 安装

pip 是一个通用的 Python 包管理工具,提供了对 Python 包的查找、下载、安装、卸载的功能。

安装 pymongo:

$ python3 -m pip3 install pymongo

也可以指定安装的版本:

$ python3 -m pip3 install pymongo==3.5.1

更新 pymongo 命令:

$ python3 -m pip3 install --upgrade pymongo

easy_install 安装

旧版的 Python 可以使用 easy_install 来安装,easy_install 也是 Python 包管理工具。

$ python -m easy_install pymongo

更新 pymongo 命令:

$ python -m easy_install -U pymongo

测试 PyMongo

接下来我们可以创建一个测试文件 demo_test_mongodb.py,代码如下:

demo_test_mongodb.py 文件代码:

#!/usr/bin/python3 import pymongo

执行以上代码文件,如果没有出现错误,表示安装成功。


创建数据库

创建一个数据库

创建数据库需要使用 MongoClient 对象,并且指定连接的 URL 地址和要创建的数据库名。

如下实例中,我们创建的数据库 runoobdb :

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

注意: 在 MongoDB 中,数据库只有在内容插入后才会创建! 就是说,数据库创建后要创建集合(数据表)并插入一个文档(记录),数据库才会真正创建。

判断数据库是否已存在

我们可以读取 MongoDB 中的所有数据库,并判断指定的数据库是否存在:

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient('mongodb://localhost:27017/')

dblist = myclient.list_database_names()

# dblist = myclient.database_names()

if "runoobdb" in dblist:

print("数据库已存在!")

注意:database_names 在最新版本的 Python 中已废弃,Python3.7+ 之后的版本改为了 list_database_names()。


创建集合

MongoDB 中的集合类似 SQL 的表。

创建一个集合

MongoDB 使用数据库对象来创建集合,实例如下:

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

mycol = mydb["sites"]

注意: 在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。

判断集合是否已存在

我们可以读取 MongoDB 数据库中的所有集合,并判断指定的集合是否存在:

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient('mongodb://localhost:27017/')

mydb = myclient['runoobdb']

collist = mydb. list_collection_names()

# collist = mydb.collection_names()

if "sites" in collist: # 判断 sites 集合是否存在

print("集合已存在!")

注意:collection_names 在最新版本的 Python 中已废弃,Python3.7+ 之后的版本改为了 list_collection_names()。


增、删、改、查等操作

Python Mongodb 插入文档

MongoDB 中的一个文档类似 SQL 表中的一条记录。

插入集合

集合中插入文档使用 insert_one() 方法,该方法的第一参数是字典 name => value 对。

以下实例向 sites 集合中插入文档:

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

mycol = mydb["sites"]

mydict = { "name": "RUNOOB", "alexa": "10000", "url": "https://www.runoob.com" }

x = mycol.insert_one(mydict)

print(x)

执行输出结果为:

<pymongo.results.InsertOneResult object at 0x10a34b288>

返回 _id 字段

insert_one() 方法返回 InsertOneResult 对象,该对象包含 inserted_id 属性,它是插入文档的 id 值。

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient('mongodb://localhost:27017/')

mydb = myclient['runoobdb']

mycol = mydb["sites"]

mydict = { "name": "Google", "alexa": "1", "url": "https://www.google.com" }

x = mycol.insert_one(mydict)

print(x.inserted_id)

执行输出结果为:

5b2369cac315325f3698a1cf

如果我们在插入文档时没有指定 _id,MongoDB 会为每个文档添加一个唯一的 id

插入多个文档

集合中插入多个文档使用 insert_many() 方法,该方法的第一参数是字典列表。

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

mycol = mydb["sites"]

mylist = [ { "name": "Taobao", "alexa": "100", "url": "https://www.taobao.com" }, { "name": "QQ", "alexa": "101", "url": "https://www.qq.com" }, { "name": "Facebook", "alexa": "10", "url": "https://www.facebook.com" }, { "name": "知乎", "alexa": "103", "url": "https://www.zhihu.com" }, { "name": "Github", "alexa": "109", "url": "https://www.github.com" } ]

x = mycol.insert_many(mylist)

print(x.inserted_ids) # 输出插入的所有文档对应的 _id 值

输出结果类似如下:

[ObjectId('5b236aa9c315325f5236bbb6'), ObjectId('5b236aa9c315325f5236bbb7'), ObjectId('5b236aa9c315325f5236bbb8'), ObjectId('5b236aa9c315325f5236bbb9'), ObjectId('5b236aa9c315325f5236bbba')]

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

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

插入指定 _id 的多个文档

我们也可以自己指定 id,插入,以下实例我们在 site2 集合中插入数据,_id 为我们指定的:

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

mycol = mydb["site2"]

mylist = [ { "_id": 1, "name": "RUNOOB", "cn_name": "菜鸟教程"}, { "_id": 2, "name": "Google", "address": "Google 搜索"}, { "_id": 3, "name": "Facebook", "address": "脸书"}, { "_id": 4, "name": "Taobao", "address": "淘宝"}, { "_id": 5, "name": "Zhihu", "address": "知乎"} ]

x = mycol.insert_many(mylist)

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

print(x.inserted_ids)

输出结果为:类型是列表

[1, 2, 3, 4, 5]

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

Python Mongodb 查询文档

MongoDB 中使用了 find 和 find_one 方法来查询集合中的数据,它类似于 SQL 中的 SELECT 语句。

本文使用的测试数据如下:

查询一条数据

我们可以使用 find_one() 方法来查询集合中的一条数据。

查询 sites 文档中的第一条数据:

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

mycol = mydb["sites"]

x = mycol.find_one()

print(x)

输出结果为:

{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}

查询集合中所有数据

find() 方法可以查询集合中的所有数据,类似 SQL 中的 SELECT * 操作。

以下实例查找 sites 集合中的所有数据:

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

mycol = mydb["sites"]

for x in mycol.find():

print(x)

输出结果为:

{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}

{'_id': ObjectId('5b2369cac315325f3698a1cf'), 'name': 'Google', 'alexa': '1', 'url': 'https://www.google.com'}

{'_id': ObjectId('5b236aa9c315325f5236bbb6'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}

{'_id': ObjectId('5b236aa9c315325f5236bbb7'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}

{'_id': ObjectId('5b236aa9c315325f5236bbb8'), 'name': 'Facebook', 'alexa': '10', 'url': 'https://www.facebook.com'}

{'_id': ObjectId('5b236aa9c315325f5236bbb9'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}

{'_id': ObjectId('5b236aa9c315325f5236bbba'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}

查询指定字段的数据

我们可以使用 find() 方法来查询指定字段的数据,将要返回的字段对应值设置为 1。

这句话的意思是说查询的结果中只返回指定的字段值。

设置字段为1的返回,设置字段为0的不返回

另外除了_id字段可以指定0或1之外,其余的字段要么指定全是0要不指定全是1

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

mycol = mydb["sites"]

# 只返回name字段和alexa字段

for x in mycol.find({},{ "_id": 0, "name": 1, "alexa": 1 }):

print(x)

输出结果为:

{'name': 'RUNOOB', 'alexa': '10000'}

{'name': 'Google', 'alexa': '1'}

{'name': 'Taobao', 'alexa': '100'}

{'name': 'QQ', 'alexa': '101'}

{'name': 'Facebook', 'alexa': '10'}

{'name': '知乎', 'alexa': '103'}

{'name': 'Github', 'alexa': '109'}

除了 _id 你不能在一个对象中同时指定 0 和 1,如果你设置了一个字段为 0,则其他都为 1,反之亦然。

以下实例除了 alexa 字段外,其他都返回:

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

mycol = mydb["sites"]

# 除alexa字段外,其余字段都返回

for x in mycol.find({},{ "alexa": 0 }):

print(x)

输出结果为:

{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'url': 'https://www.runoob.com'}

{'_id': ObjectId('5b2369cac315325f3698a1cf'), 'name': 'Google', 'url': 'https://www.google.com'}

{'_id': ObjectId('5b236aa9c315325f5236bbb6'), 'name': 'Taobao', 'url': 'https://www.taobao.com'}

{'_id': ObjectId('5b236aa9c315325f5236bbb7'), 'name': 'QQ', 'url': 'https://www.qq.com'}

{'_id': ObjectId('5b236aa9c315325f5236bbb8'), 'name': 'Facebook', 'url': 'https://www.facebook.com'}

{'_id': ObjectId('5b236aa9c315325f5236bbb9'), 'name': '知乎', 'url': 'https://www.zhihu.com'}

{'_id': ObjectId('5b236aa9c315325f5236bbba'), 'name': 'Github', 'url': 'https://www.github.com'}

以下代码同时指定了 0 和 1 则会报错

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

mycol = mydb["sites"]

for x in mycol.find({},{ "name": 1, "alexa": 0 }):

print(x)

错误内容大概如下:

...

pymongo.errors.OperationFailure: Projection cannot have a mix of inclusion and exclusion.

...

根据指定条件查询

我们可以在 find() 中设置参数来过滤数据。参数需要字典形式的

以下实例查找 address 字段为 "Park Lane 38" 的数据:

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

mycol = mydb["sites"]

myquery = { "name": "RUNOOB" }

mydoc = mycol.find(myquery)

for x in mydoc:

print(x)

输出结果为:

{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}

高级查询

查询的条件语句中,我们还可以使用修饰符。

以下实例用于读取 name 字段中第一个字母 ASCII 值大于 "H" 的数据,大于的修饰符条件为 {"$gt": "H"} :

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

mycol = mydb["sites"]

myquery = { "name": { "$gt": "H" } }

mydoc = mycol.find(myquery)

for x in mydoc:

print(x)

输出结果为:

{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}

{'_id': ObjectId('5b236aa9c315325f5236bbb6'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}

{'_id': ObjectId('5b236aa9c315325f5236bbb7'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}

{'_id': ObjectId('5b236aa9c315325f5236bbb9'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}

使用正则表达式查询

我们还可以使用正则表达式作为修饰符。

正则表达式修饰符只用于搜索字符串的字段。

以下实例用于读取 name 字段中第一个字母为 "R" 的数据,正则表达式修饰符条件为 {"$regex": "^R"} :

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

mycol = mydb["sites"]

myquery = { "name": { "$regex": "^R" } }

mydoc = mycol.find(myquery)

for x in mydoc:

print(x)

输出结果为:

{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}

返回指定条数记录

如果我们要对查询结果设置指定条数的记录可以使用 limit() 方法,该方法只接受一个数字参数。

以下实例返回 3 条文档记录:

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

mycol = mydb["sites"]

myresult = mycol.find().limit(3)

# 输出结果

for x in myresult:

print(x)

输出结果为:

{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}

{'_id': ObjectId('5b2369cac315325f3698a1cf'), 'name': 'Google', 'alexa': '1', 'url': 'https://www.google.com'}

{'_id': ObjectId('5b236aa9c315325f5236bbb6'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}

Python Mongodb 修改文档

我们可以在 MongoDB 中使用 update_one() 方法修改文档中的记录。

该方法第一个参数为查询的条件,第二个参数为要修改的字段。

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

注意更新的语句语法,需要使用“$set”

本文使用的测试数据如下(点击图片查看大图):

以下实例将 alexa 字段的值 10000 改为 12345:

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

mycol = mydb["sites"]

myquery = { "alexa": "10000" }

newvalues = { "$set": { "alexa": "12345" } } mycol.update_one(myquery, newvalues)

# 输出修改后的 "sites" 集合

for x in mycol.find():

print(x)

执行输出结果为:

update_one() 方法只能修改匹配到的第一条记录,如果要修改所有匹配到的记录,可以使用 update_many()。

以下实例将查找所有以 F 开头的 name 字段,并将匹配到所有记录的 alexa 字段修改为 123

实例

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

mycol = mydb["sites"]

myquery = { "name": { "$regex": "^F" } }

newvalues = { "$set": { "alexa": "123" } }

x = mycol.update_many(myquery, newvalues)

print(x.modified_count, "文档已修改")

输出结果为:

1 文档已修改

查看数据是否已修改:

排序

sort() 方法可以指定升序或降序排序。

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

本文使用的测试数据如下(点击图片查看大图):

对字段 alexa 按升序排序:

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

mycol = mydb["sites"]

mydoc = mycol.find().sort("alexa")

for x in mydoc:

print(x)

输出结果为:

对字段 alexa 按降序排序:

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

mycol = mydb["sites"]

mydoc = mycol.find().sort("alexa", -1)

for x in mydoc:

print(x)

输出结果为:

Python Mongodb 删除数据

我们可以使用 delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据。需要字典的样式

本文使用的测试数据如下(点击图片查看大图):

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

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

mycol = mydb["sites"]

myquery = { "name": "Taobao" }

mycol.delete_one(myquery)

# 删除后输出

for x in mycol.find():

print(x)

输出结果为:

删除多个文档

我们可以使用 delete_many() 方法来删除多个文档,该方法第一个参数为查询对象,指定要删除哪些数据。

删除所有 name 字段中以 F 开头的文档:

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

mycol = mydb["sites"]

myquery = { "name": {"$regex": "^F"} }

x = mycol.delete_many(myquery)

print(x.deleted_count, "个文档已删除")

输出结果为:

1 个文档已删除

删除集合中的所有文档

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

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

mycol = mydb["sites"]

x = mycol.delete_many({})

print(x.deleted_count, "个文档已删除")

# deleted_count统计删除的个数

输出结果为:

5 个文档已删除

删除集合

我们可以使用 drop() 方法来删除一个集合。

以下实例删除了 sites集合:

实例

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["runoobdb"]

mycol = mydb["sites"]

mycol.drop()

如果删除成功 drop() 返回 true,如果删除失败(集合不存在)则返回 false。

我们使用以下命令在终端查看集合是否已删除:

> use runoobdb

switched to db runoobdb

> show tables;

Python MongoDB 教程的更多相关文章

  1. Python爬虫教程-34-分布式爬虫介绍

    Python爬虫教程-34-分布式爬虫介绍 分布式爬虫在实际应用中还算是多的,本篇简单介绍一下分布式爬虫 什么是分布式爬虫 分布式爬虫就是多台计算机上都安装爬虫程序,重点是联合采集.单机爬虫就是只在一 ...

  2. 吴裕雄--天生自然python学习笔记:Python MongoDB

    MongoDB 是目前最流行的 NoSQL 数据库之一,使用的数据类型 BSON(类似 JSON). PyMongo Python 要连接 MongoDB 需要 MongoDB 驱动,这里我们使用 P ...

  3. Python快速教程 尾声

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 写了将近两年的Python快速教程,终于大概成形.这一系列文章,包括Python基 ...

  4. 【Python大系】Python快速教程

    感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容很多,加上各种标准库.拓展库, ...

  5. CentOS 5系统安装Django、Apache 、mod_wsgi部署Python环境教程

    Django,是一款针对Python环境的WEB开发框架,能够帮助我们构架快捷.简单的WEB框架设置,Django框架非常适合开发内容应用环境,所以在本文中,麦子将整理基于Centos系统部署安装Dj ...

  6. 《Python算法教程》译者序

    在计算机的世界中,算法本质上是我们对某一个问题或者某一类问题的解决方案.也就是说,如果我们想用计算机来解决问题的话,就必须将问题的解决思路准确而完整地描述出来,同时计算机也要能理解这个描述.这需要我们 ...

  7. 改写《python基础教程》中的一个例子

    一.前言 初学python,看<python基础教程>,第20章实现了将文本转化成html的功能.由于本人之前有DIY一个markdown转html的算法,所以对这个例子有兴趣.可仔细一看 ...

  8. python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API

    python  Django教程  之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码 ...

  9. python Django教程 之模板渲染、循环、条件判断、常用的标签、过滤器

    python3.5 manage.py runserver python Django教程 之模板渲染.循环.条件判断.常用的标签.过滤器 一.Django模板渲染模板 1. 创建一个 zqxt_tm ...

随机推荐

  1. 万维网 WWW (World Wide Web)

    万维网 WWW (World Wide Web)并非某种特殊的计算机网络.万维网是一个大规模的.联机式的信息储藏所.万维网用链接的方法能非常方便地从因特网上的一个站点访问另一个站点,从而主动地按需获取 ...

  2. 桌面系统集成WEB认证系统方案

    最近做的一个项目,有WEB版.WPF版.手机版.领导想集成集团的一个现成的认证系统,姑且称这个认证系统名为 W4认证系统. W4认证系统有如下特点: 1.现成的 2.是个单点登录系统 3.不支持oAu ...

  3. HDU 5446 CRT+Lucas+快速乘

    Unknown Treasure Problem Description On the way to the next secret treasure hiding place, the mathem ...

  4. 8.30 "我什么都不会"

    /* 抢名额第一场 GG "我什么都不会阿" 这场磕死在E题了 按说应该能想到费马小定理 毕竟p is a prime 别的队都过了 大家都比较熟悉的就只有这一个 然后还有I题一开 ...

  5. Mariadb-lib

    mariadb-libs-5.5.44-2.el7.centos.x86_64

  6. form表单点击后验证

    function check(){ var customertype = document.getElementById("customertype"); //alert(cust ...

  7. jquery实现图片预加载提高页面加载速度

    使用jquery实现图片预加载提高页面加载速度和用户体 我们在做网站的时候经常会遇到这样的问题:一个页面有大量的图片导致页面加载速度缓慢,经常会出现一个白页用户体验很不好.那么如何解决这个问题 呢?首 ...

  8. cookie和seesion区别

    cookie 和session 的区别详解 这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie ...

  9. $Vijos P1250$

    背包? 跑完并查集 分组背包完事 #include <bits/stdc++.h> #define rep(i,j,n) for(register int i=j;i<=n;i++) ...

  10. BZOJ 2178 Simpson积分

    思路: 我发现能用Simpson积分水的题  好像都是裸题诶233333 //By SiriusRen #include <bits/stdc++.h> using namespace s ...