python中MongoDB save,insert,update,replace這幾個(gè)方法的使用

一、 使用背景

在用python調(diào)用MongoDB操作文檔時(shí)遇到過很多場(chǎng)景,常規(guī)操作是插入,更新,還有按條件替換,存儲(chǔ)等。這些場(chǎng)景中用到過insert,update,replace,save。要是不理一下很容易被這幾個(gè)方法搞糊涂。

二、 insert插入文檔

1. 插入單個(gè)文檔insert_one

當(dāng)需要插入單個(gè)文檔的時(shí)候用insert_one方法。

參數(shù)

insert_one(self, document, bypass_document_validation=False, session=None)

要插入的文檔必須是可變映射類型(通常是字典)。如果文檔沒有 _id 字段,則會(huì)自動(dòng)添加一個(gè)。

返回

insert_one() 方法返回 pymongo.results.InsertOneResult對(duì)象,該對(duì)象包含 inserted_id 屬性,它是插入文檔的 id 值。

使用實(shí)例:

>>> db.test.count_documents({'x': 1})
0
>>> result = db.test.insert_one({'x': 1})
>>> result.inserted_id
ObjectId('54f112defba522406c9cc208')
>>> db.test.find_one({'x': 1})
{u'x': 1, u'_id': ObjectId('54f112defba522406c9cc208')}

2.插入多個(gè)文檔insert_many

當(dāng)需要一次性插入多個(gè)文檔時(shí)用insert_many()方法。

參數(shù)

insert_many(self, documents, ordered=True, bypass_document_validation=False, session=None)

該方法的第一參數(shù)是字典列表。

返回值

insert_many() 方法返回 pymongo.results.InsertManyResult對(duì)象,該對(duì)象包含 inserted_ids 屬性,該屬性保存著所有插入文檔的 id 值。

使用實(shí)例

>>> db.test.count_documents({})
0
>>> result = db.test.insert_many([{'x': i} for i in range(2)])
>>> result.inserted_ids
[ObjectId('54f113fffba522406c9cc20e'), ObjectId('54f113fffba522406c9cc20f')]
>>> db.test.count_documents({})
2

注意:插入的時(shí)候可以指定_id。

三、 update更新文檔

在MongoDB中可以使用update_one()方法更新文檔。

參數(shù)和返回

update_one(self, filter, update, upsert=False, multi=False, bypass_document_validation=False,
                   collation=None, array_filters=None, session=None):
  • filter: 匹配要更新的文檔的查詢條件。
  • update:要修改的字段。
  • upsert(可選,默認(rèn)為False):如果為“True”,如果沒有文檔匹配過濾器,則執(zhí)行插入。
    如果查找到的匹配數(shù)據(jù)多于一條,則只會(huì)修改第一條。
  • multi(可選,默認(rèn)為False):如果為“True”,則更新查詢到的所有數(shù)據(jù)。
    update_one()方法只能修匹配到的第一條記錄,如果要修改所有匹配到的記錄,可以使用 update_many()

該方法返回pymongo.results.UpdateResult對(duì)象。

使用實(shí)例

>>> for doc in db.test.find():
...     print(doc)
...
{u'x': 1, u'_id': 0}
{u'x': 1, u'_id': 1}
{u'x': 1, u'_id': 2}
>>> result = db.test.update_one({'x': 1}, {'$inc': {'x': 3}})
>>> result.matched_count
1
>>> result.modified_count
1
>>> for doc in db.test.find():
...     print(doc)
...
{u'x': 4, u'_id': 0}
{u'x': 1, u'_id': 1}
{u'x': 1, u'_id': 2}

四、 save更新文檔

MongoDB中還可以使用save來更新文檔。

參數(shù)

save(self, to_save, manipulate=True, check_keys=True, **kwargs)

此方法已被官方棄用,推薦使用insert_one方法,和replace_one方法。

 **DEPRECATED** - Use :meth:`insert_one` or :meth:`replace_one` instead.

使用時(shí)會(huì)返回預(yù)警信息。

warnings.warn("save is deprecated. Use insert_one or replace_one "
                      "instead", DeprecationWarning, stacklevel=2)

五、 replace替換文檔

當(dāng)需要替換文檔的時(shí)候可以使用MongoDB的replace方法。

參數(shù)

replace_one(self, filter, replacement, upsert=False, bypass_document_validation=False, 
                collation=None, session=None)
  • filter:匹配要替換的文檔的查詢條件。
  • replacement:新文件。
  • upsert(可選):如果為“True”,如果沒有文檔匹配過濾器,則執(zhí)行插入。

返回

該方法返回pymongo.results.UpdateResult對(duì)象。

使用實(shí)例

>>> for doc in db.test.find({}):
...     print(doc)
...
{u'x': 1, u'_id': ObjectId('54f4c5befba5220aa4d6dee7')}
>>> result = db.test.replace_one({'x': 1}, {'y': 1})
>>> result.matched_count
1
>>> result.modified_count
1
>>> for doc in db.test.find({}):
...     print(doc)
...
{u'y': 1, u'_id': ObjectId('54f4c5befba5220aa4d6dee7')}


## 如果沒有匹配到條件中的文檔,使用upsert選項(xiàng)可以執(zhí)行插入操作

>>> result = db.test.replace_one({'x': 1}, {'x': 1}, True)
>>> result.matched_count
0
>>> result.modified_count
0
>>> result.upserted_id
ObjectId('54f11e5c8891e756a6e1abd4')
>>> db.test.find_one({'x': 1})
{u'x': 1, u'_id': ObjectId('54f11e5c8891e756a6e1abd4')}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容