跟我一起從零開始學(xué)python(六)數(shù)據(jù)庫編程:MongoDB數(shù)據(jù)庫

前言

回顧之前講了python語法編程 ,必修入門基礎(chǔ)和網(wǎng)絡(luò)編程,多線程/多進(jìn)程/協(xié)程等方面的內(nèi)容沉帮,昨天和今天講到了數(shù)據(jù)庫編程篇MySQL屡萤,Redis今天第三篇MongoDB篇珍剑,前面沒看的也不用往前翻,系列文已經(jīng)整理好了:

1.跟我一起從零開始學(xué)python(一)編程語法必修
2.跟我一起從零開始學(xué)python(二)網(wǎng)絡(luò)編程
3.跟我一起從零開始學(xué)python(三)多線程/多進(jìn)程/協(xié)程
4.跟我一起從零開始學(xué)python(四)數(shù)據(jù)庫編程:MySQL數(shù)據(jù)庫
5.跟我一起從零開始學(xué)python(五)數(shù)據(jù)庫編程:Redis數(shù)據(jù)庫

本篇講:python數(shù)據(jù)庫編程:MongoDB數(shù)據(jù)庫

本系列文根據(jù)以下學(xué)習(xí)路線展開講述死陆,由于內(nèi)容較多招拙,:

從零開始學(xué)python到高級(jí)進(jìn)階路線圖

下章講:機(jī)器學(xué)習(xí)模塊

一丶MongoDB簡(jiǎn)單介紹

Python MongoDB是一種非關(guān)系型數(shù)據(jù)庫,也被稱為NoSQL數(shù)據(jù)庫翔曲。旨在提供高性能迫像、高可用性和可擴(kuò)展性的數(shù)據(jù)存儲(chǔ)解決方案。Python MongoDB使用JSON格式存儲(chǔ)數(shù)據(jù)瞳遍,這使得它非常適合處理大量非結(jié)構(gòu)化數(shù)據(jù)闻妓。

Python MongoDB的主要特點(diǎn)包括

  • 高性能:Python MongoDB使用內(nèi)存映射技術(shù),可以快速讀取和寫入數(shù)據(jù)掠械。

  • 高可用性:Python MongoDB支持主從復(fù)制和分片技術(shù)由缆,可以保證數(shù)據(jù)的可靠性和可用性。

  • 可擴(kuò)展性:Python MongoDB可以輕松地?cái)U(kuò)展到多個(gè)節(jié)點(diǎn)猾蒂,以滿足不斷增長(zhǎng)的數(shù)據(jù)需求均唉。

  • 靈活性:Python MongoDB支持動(dòng)態(tài)模式,可以根據(jù)需要隨時(shí)更改數(shù)據(jù)結(jié)構(gòu)肚菠。

  • 易用性:Python MongoDB提供了簡(jiǎn)單易用的API舔箭,可以輕松地進(jìn)行數(shù)據(jù)操作。

Python MongoDB的安裝非常簡(jiǎn)單蚊逢,只需要使用pip命令即可安裝层扶。安裝完成后,可以使用pymongo庫來連接和操作MongoDB數(shù)據(jù)庫烙荷。

Python MongoDB的應(yīng)用場(chǎng)景非常廣泛镜会,特別是在大數(shù)據(jù)處理和實(shí)時(shí)數(shù)據(jù)分析方面。它可以用于存儲(chǔ)日志數(shù)據(jù)终抽、社交媒體數(shù)據(jù)戳表、物聯(lián)網(wǎng)數(shù)據(jù)等各種類型的非結(jié)構(gòu)化數(shù)據(jù)桶至。同時(shí),Python MongoDB也可以與其他數(shù)據(jù)存儲(chǔ)解決方案(如關(guān)系型數(shù)據(jù)庫)進(jìn)行集成匾旭,以滿足不同的數(shù)據(jù)處理需求镣屹。

總之,Python MongoDB是一種高性能季率、高可用性和可擴(kuò)展性的數(shù)據(jù)存儲(chǔ)解決方案野瘦,可以幫助開發(fā)人員輕松地處理大量非結(jié)構(gòu)化數(shù)據(jù)。

二丶關(guān)于database的基礎(chǔ)命令

MongoDB是一種非關(guān)系型數(shù)據(jù)庫飒泻,它使用文檔存儲(chǔ)數(shù)據(jù)鞭光,而不是使用表格。Python是一種流行的編程語言泞遗,它可以與MongoDB數(shù)據(jù)庫進(jìn)行交互惰许。在Python中,我們可以使用PyMongo庫來連接和操作MongoDB數(shù)據(jù)庫史辙。

在MongoDB中汹买,我們可以使用以下基礎(chǔ)命令來管理數(shù)據(jù)庫:

創(chuàng)建數(shù)據(jù)庫

在MongoDB中,我們可以使用use命令來創(chuàng)建一個(gè)新的數(shù)據(jù)庫聊倔。例如晦毙,要?jiǎng)?chuàng)建一個(gè)名為mydatabase的數(shù)據(jù)庫,我們可以使用以下命令:

use mydatabase

如果數(shù)據(jù)庫不存在耙蔑,則MongoDB將創(chuàng)建一個(gè)新的數(shù)據(jù)庫见妒。如果數(shù)據(jù)庫已經(jīng)存在,則MongoDB將返回該數(shù)據(jù)庫的引用甸陌。

顯示數(shù)據(jù)庫

要顯示MongoDB中所有的數(shù)據(jù)庫须揣,我們可以使用以下命令:

show dbs

這將列出MongoDB中所有的數(shù)據(jù)庫。

刪除數(shù)據(jù)庫

要?jiǎng)h除MongoDB中的數(shù)據(jù)庫钱豁,我們可以使用以下命令:

db.dropDatabase()

這將刪除當(dāng)前選定的數(shù)據(jù)庫耻卡。

切換數(shù)據(jù)庫

要切換到MongoDB中的另一個(gè)數(shù)據(jù)庫,我們可以使用以下命令:

use anotherdatabase

這將切換到名為anotherdatabase的數(shù)據(jù)庫牲尺。

顯示當(dāng)前數(shù)據(jù)庫

要顯示當(dāng)前選定的數(shù)據(jù)庫卵酪,我們可以使用以下命令:

db

這將返回當(dāng)前選定的數(shù)據(jù)庫的引用。

總之谤碳,Python與MongoDB數(shù)據(jù)庫的交互非常方便凛澎,可以使用PyMongo庫來連接和操作MongoDB數(shù)據(jù)庫。在Python中估蹄,我們可以使用基礎(chǔ)命令來管理數(shù)據(jù)庫,例如創(chuàng)建沫换、顯示臭蚁、刪除和切換數(shù)據(jù)庫最铁。

三丶關(guān)于集合的基礎(chǔ)命令

Python MongoDB數(shù)據(jù)庫關(guān)于集合的基礎(chǔ)命令

在Python中使用MongoDB數(shù)據(jù)庫時(shí),集合是MongoDB中的一個(gè)重要概念垮兑。集合類似于關(guān)系型數(shù)據(jù)庫中的表冷尉,但是MongoDB是一個(gè)文檔型數(shù)據(jù)庫,因此集合中存儲(chǔ)的是文檔系枪。

以下是Python MongoDB數(shù)據(jù)庫關(guān)于集合的基礎(chǔ)命令

創(chuàng)建集合

要?jiǎng)?chuàng)建一個(gè)集合雀哨,可以使用MongoDB的db.create_collection()方法。在Python中私爷,可以使用pymongo庫中的Collection類的insert_one()方法來創(chuàng)建集合雾棺。

import pymongo

# 連接MongoDB數(shù)據(jù)庫
client = pymongo.MongoClient("mongodb://localhost:27017/")

# 創(chuàng)建一個(gè)名為mycollection的集合
mydb = client["mydatabase"]
mycol = mydb["mycollection"]

插入文檔

要向集合中插入文檔,可以使用MongoDB的db.collection.insert()方法衬浑。在Python中捌浩,可以使用pymongo庫中的Collection類的insert_one()方法來插入文檔。

import pymongo

# 連接MongoDB數(shù)據(jù)庫
client = pymongo.MongoClient("mongodb://localhost:27017/")

# 獲取mycollection集合
mydb = client["mydatabase"]
mycol = mydb["mycollection"]

# 插入一條文檔
mydict = { "name": "John", "address": "Highway 37" }
x = mycol.insert_one(mydict)

查詢文檔

要查詢集合中的文檔工秩,可以使用MongoDB的db.collection.find()方法尸饺。在Python中,可以使用pymongo庫中的Collection類的find()方法來查詢文檔助币。

import pymongo

# 連接MongoDB數(shù)據(jù)庫
client = pymongo.MongoClient("mongodb://localhost:27017/")

# 獲取mycollection集合
mydb = client["mydatabase"]
mycol = mydb["mycollection"]

# 查詢所有文檔
for x in mycol.find():
  print(x)

更新文檔

要更新集合中的文檔浪听,可以使用MongoDB的db.collection.update()方法。在Python中眉菱,可以使用pymongo庫中的Collection類的update_one()方法來更新文檔迹栓。

import pymongo

# 連接MongoDB數(shù)據(jù)庫
client = pymongo.MongoClient("mongodb://localhost:27017/")

# 獲取mycollection集合
mydb = client["mydatabase"]
mycol = mydb["mycollection"]

# 更新一條文檔
myquery = { "address": "Highway 37" }
newvalues = { "$set": { "address": "Park Lane 38" } }
mycol.update_one(myquery, newvalues)

刪除文檔

要?jiǎng)h除集合中的文檔,可以使用MongoDB的db.collection.remove()方法倍谜。在Python中迈螟,可以使用pymongo庫中的Collection類的delete_one()方法來刪除文檔。

import pymongo

# 連接MongoDB數(shù)據(jù)庫
client = pymongo.MongoClient("mongodb://localhost:27017/")

# 獲取mycollection集合
mydb = client["mydatabase"]
mycol = mydb["mycollection"]

# 刪除一條文檔
myquery = { "address": "Park Lane 38" }
mycol.delete_one(myquery)

四丶數(shù)據(jù)類型

MongoDB數(shù)據(jù)庫支持以下數(shù)據(jù)類型

  • String(字符串):存儲(chǔ)文本數(shù)據(jù)尔崔,最常用的數(shù)據(jù)類型答毫。

  • Integer(整型):存儲(chǔ)整數(shù)。

  • Boolean(布爾型):存儲(chǔ)布爾值(true/false)季春。

  • Double(雙精度浮點(diǎn)型):存儲(chǔ)浮點(diǎn)數(shù)洗搂。

  • Min/Max keys(最小值/最大值):用于比較值的最小值和最大值。

  • Arrays(數(shù)組):用于存儲(chǔ)數(shù)組或列表载弄。

  • Timestamp(時(shí)間戳):記錄文檔修改或添加的時(shí)間耘拇。

  • Object(對(duì)象):用于嵌入式文檔。

  • Null(空值):用于表示空值或不存在的字段宇攻。

  • Symbol(符號(hào)):類似于字符串惫叛,但是用于特定的上下文環(huán)境。

  • Date(日期):用于存儲(chǔ)日期和時(shí)間逞刷。

  • Object ID(對(duì)象ID):用于唯一標(biāo)識(shí)文檔嘉涌。

  • Binary data(二進(jìn)制數(shù)據(jù)):用于存儲(chǔ)二進(jìn)制數(shù)據(jù)坷牛,如圖片饮六、音頻等踊沸。

  • Code(代碼):用于存儲(chǔ)JavaScript代碼肄鸽。

  • Regular expression(正則表達(dá)式):用于存儲(chǔ)正則表達(dá)式。

五丶數(shù)據(jù)操作

Python中操作MongoDB數(shù)據(jù)庫的方式有多種警医,可以使用官方提供的pymongo庫亿胸,也可以使用第三方庫mongoengine等。

以下是pymongo庫的基本數(shù)據(jù)操作:

連接數(shù)據(jù)庫

import pymongo

client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client['testdb']

插入數(shù)據(jù)

collection = db['testcollection']
data = {'name': 'Tom', 'age': 18}
collection.insert_one(data)

查詢數(shù)據(jù)

# 查詢所有數(shù)據(jù)
result = collection.find()
for item in result:
    print(item)

# 查詢指定條件的數(shù)據(jù)
result = collection.find({'name': 'Tom'})
for item in result:
    print(item)

更新數(shù)據(jù)

# 更新一條數(shù)據(jù)
collection.update_one({'name': 'Tom'}, {'$set': {'age': 20}})

# 更新多條數(shù)據(jù)
collection.update_many({'name': 'Tom'}, {'$set': {'age': 20}})

刪除數(shù)據(jù)

# 刪除一條數(shù)據(jù)
collection.delete_one({'name': 'Tom'})

# 刪除多條數(shù)據(jù)
collection.delete_many({'name': 'Tom'})

聚合操作

# 統(tǒng)計(jì)數(shù)據(jù)總數(shù)
count = collection.count_documents({})

# 按條件分組統(tǒng)計(jì)
result = collection.aggregate([
    {'$group': {'_id': '$name', 'count': {'$sum': 1}}}
])
for item in result:
    print(item)

以上是pymongo庫的基本數(shù)據(jù)操作预皇,其他庫的操作方式也類似

六丶數(shù)據(jù)的備份與恢復(fù)

Python中備份和恢復(fù)MongoDB數(shù)據(jù)庫可以使用mongodumpmongorestore命令侈玄,也可以使用pymongo庫中的函數(shù)進(jìn)行操作。

使用mongodumpmongorestore命令備份和恢復(fù)MongoDB數(shù)據(jù)庫

備份MongoDB數(shù)據(jù)庫:

mongodump --host <host> --port <port> --db <database> --out <backup_directory>

其中深啤,<host>是MongoDB服務(wù)器的IP地址或主機(jī)名拗馒,<port>是MongoDB服務(wù)器的端口號(hào),默認(rèn)為27017溯街,<database>是要備份的數(shù)據(jù)庫名稱诱桂,<backup_directory>是備份文件存放的目錄。

恢復(fù)MongoDB數(shù)據(jù)庫:

mongorestore --host <host> --port <port> --db <database> <backup_directory>

其中呈昔,<host>挥等、<port>、<database>和<backup_directory>的含義與備份命令相同堤尾。

使用pymongo庫備份和恢復(fù)MongoDB數(shù)據(jù)庫

備份MongoDB數(shù)據(jù)庫:

import pymongo
import datetime

client = pymongo.MongoClient("<mongodb_uri>")
db = client["<database>"]
collection = db["<collection>"]

backup = collection.find()

with open("<backup_file>", "w") as f:
    for doc in backup:
        f.write(str(doc) + "\n")

其中肝劲,<mongodb_uri>是MongoDB服務(wù)器的URI,<database>和<collection>是要備份的數(shù)據(jù)庫和集合名稱郭宝,<backup_file>是備份文件的路徑辞槐。

恢復(fù)MongoDB數(shù)據(jù)庫:

import pymongo

client = pymongo.MongoClient("<mongodb_uri>")
db = client["<database>"]
collection = db["<collection>"]

with open("<backup_file>", "r") as f:
    for line in f:
        doc = eval(line.strip())
        collection.insert_one(doc)

其中,<mongodb_uri>粘室、<database>榄檬、<collection>和<backup_file>的含義與備份命令相同。注意衔统,這種方法只適用于備份和恢復(fù)小型數(shù)據(jù)庫鹿榜,對(duì)于大型數(shù)據(jù)庫,建議使用mongodumpmongorestore命令進(jìn)行操作锦爵。

七丶聚合操作

MongoDB的聚合操作是指將多個(gè)文檔進(jìn)行分組舱殿、篩選、排序险掀、計(jì)算等操作沪袭,以生成新的文檔集合的過程。Python中可以使用pymongo庫來進(jìn)行MongoDB的聚合操作樟氢。

以下是一個(gè)簡(jiǎn)單的聚合操作示例冈绊,假設(shè)我們有一個(gè)名為students的集合创倔,其中包含每個(gè)學(xué)生的姓名、年齡和成績(jī):

from pymongo import MongoClient

client = MongoClient()
db = client['test']
collection = db['students']

pipeline = [
    {"$group": {"_id": "$age", "avg_score": {"$avg": "$score"}}},
    {"$sort": {"_id": 1}}
]

result = collection.aggregate(pipeline)

for doc in result:
    print(doc)

上述代碼中焚碌,我們使用了MongoDB的group和group和avg操作符來計(jì)算每個(gè)年齡段的平均成績(jī),并使用$sort操作符按年齡升序排序霸妹。最終的結(jié)果將會(huì)是一個(gè)包含每個(gè)年齡段平均成績(jī)的文檔集合十电。

除了group和group和avg操作符外,MongoDB還提供了許多其他的聚合操作符叹螟,如match鹃骂、match、project罢绽、sort畏线、sort、limit等良价,可以根據(jù)具體需求進(jìn)行組合使用寝殴。

八丶索引

MongoDB中的索引是用于提高查詢性能的一種數(shù)據(jù)結(jié)構(gòu)。在MongoDB中明垢,可以使用多種類型的索引蚣常,包括單字段索引、復(fù)合索引痊银、全文索引等抵蚊。

以下是使用Python操作MongoDB索引的示例:

創(chuàng)建單字段索引

from pymongo import MongoClient

client = MongoClient()
db = client.test_database
collection = db.test_collection

# 創(chuàng)建單字段索引
collection.create_index("name")

# 查詢是否創(chuàng)建成功
print(collection.index_information())

創(chuàng)建復(fù)合索引

from pymongo import MongoClient

client = MongoClient()
db = client.test_database
collection = db.test_collection

# 創(chuàng)建復(fù)合索引
collection.create_index([("name", 1), ("age", -1)])

# 查詢是否創(chuàng)建成功
print(collection.index_information())

創(chuàng)建全文索引

from pymongo import MongoClient

client = MongoClient()
db = client.test_database
collection = db.test_collection

# 創(chuàng)建全文索引
collection.create_index([("content", "text")])

# 查詢是否創(chuàng)建成功
print(collection.index_information())

查詢使用索引

from pymongo import MongoClient

client = MongoClient()
db = client.test_database
collection = db.test_collection

# 查詢使用索引
result = collection.find({"name": "Tom"}).explain()["executionStats"]
print(result)

以上是Python操作MongoDB索引的示例,可以根據(jù)實(shí)際需求選擇不同類型的索引來提高查詢性能溯革。

九丶pymongo的操作

Python中操作MongoDB數(shù)據(jù)庫需要使用pymongo庫贞绳,以下是pymongo庫的常用操作:

連接MongoDB數(shù)據(jù)庫

import pymongo

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

選擇數(shù)據(jù)庫

db = client['database_name']

選擇集合

collection = db['collection_name']

插入文檔

data = {'name': 'John', 'age': 25}
collection.insert_one(data)

查詢文檔

result = collection.find_one({'name': 'John'})

更新文檔

collection.update_one({'name': 'John'}, {'$set': {'age': 30}})

刪除文檔

collection.delete_one({'name': 'John'})

查詢多個(gè)文檔

results = collection.find({'age': {'$gt': 20}})
for result in results:
    print(result)

以上是pymongo庫的常用操作,可以根據(jù)實(shí)際需求進(jìn)行調(diào)用致稀。

本系列文根據(jù)以下學(xué)習(xí)路線展開講述冈闭,由于內(nèi)容較多,:

從零開始學(xué)python到高級(jí)進(jìn)階路線圖

下章講:機(jī)器學(xué)習(xí)模塊

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末豺裆,一起剝皮案震驚了整個(gè)濱河市拒秘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌臭猜,老刑警劉巖躺酒,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蔑歌,居然都是意外死亡羹应,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門次屠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來园匹,“玉大人雳刺,你說我怎么就攤上這事÷阄ィ” “怎么了掖桦?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)供汛。 經(jīng)常有香客問我枪汪,道長(zhǎng),這世上最難降的妖魔是什么怔昨? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任雀久,我火速辦了婚禮,結(jié)果婚禮上趁舀,老公的妹妹穿的比我還像新娘赖捌。我一直安慰自己,他們只是感情好矮烹,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布越庇。 她就那樣靜靜地躺著,像睡著了一般擂送。 火紅的嫁衣襯著肌膚如雪悦荒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天嘹吨,我揣著相機(jī)與錄音搬味,去河邊找鬼。 笑死蟀拷,一個(gè)胖子當(dāng)著我的面吹牛碰纬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播问芬,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼悦析,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了此衅?” 一聲冷哼從身側(cè)響起强戴,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挡鞍,沒想到半個(gè)月后骑歹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡墨微,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年道媚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡最域,死狀恐怖谴分,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情镀脂,我是刑警寧澤牺蹄,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站薄翅,受9級(jí)特大地震影響钞馁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匿刮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望探颈。 院中可真熱鬧熟丸,春花似錦、人聲如沸伪节。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怀大。三九已至纱兑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間化借,已是汗流浹背潜慎。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蓖康,地道東北人铐炫。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蒜焊,于是被迫代替她去往敵國(guó)和親倒信。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容