1. 程式人生 > 資料庫 >MongoDB CRUD操作中的插入例項教程

MongoDB CRUD操作中的插入例項教程

溫習了MongoDB的插入操作,主要使用PHP語言實踐。

目的

  • 理解官方shell和PHP SDK操作的差異
  • 以MySQL的思維理解MongoDB的shell,感覺差異還是很大的
  • 理解有多少種插入操作,以及差異點
  • 重點理解異常操作,如何看官方文件

mongoDB shell

insertMany()、insert()、insertOne()三個方法大體上是差不多的,insertMany()相當於批處理,insertOne()是插入當個,這兩個函式返回的物件沒有明確指示,insert()相當於批處理,如果插入的是單個文件,返回的是WriteResult物件,如果是多個文件返回BulkWriteResult物件(真正的批量操作)。

如果產生異常,則會返回writeConcernErrors和writeErrors兩種錯誤,有兩個細節。

如果是批量插入,ordered是true,則遇到一個錯誤,後面就不返回了,反之則會繼續執行,不過最終都會丟擲異常。

其次遇到異常就不會返回_ids,這一點覺得特別讓人難以理解,若何知曉插入了那些ID?

再次強調,對於MongoDB來說,只能保證單個文件插入是原子性的。另外MongoDB插入的文件不存在,則會自動外掛文件。

db.collection.insertMany(
  [ <document 1>,<document 2>,... ],{
   writeConcern: <document>,ordered: <boolean>
  }
)

PHP SDK

各個語言SDK和官方SHELL是差不多的,看的時候可以對照著看。

對於insertMany函式來說,如果處理正常返回的是MongoDB\InsertManyResult物件,它實際上是MongoDB\Driver\WriteResult 擴充套件的包裝。

如果遇到異常,可以通過 MongoDB\Driver\Exception\WriteException::getWriteResult 擴充套件方法獲取,它返回的實際上也是MongoDB\Driver\WriteResult物件。該物件的getWriteConcernError、getWriteErrors函式可以獲取具體的錯誤資訊,從而決定程式如何處理。

對於異常來說,還有其他錯誤型別,比如MongoDB\Exception\InvalidArgumentException、MongoDB\Driver\Exception\RuntimeException。

最後通過一個例子來說明:

$obj = $collection->insertMany(
  [
   [
      '_id' => "5f03014f73efc304f72dc6e2",'email' => '[email protected]',],[
      'username' => 'test','email' => '[email protected]',]
  ],[ "ordered"=>false]
  );
  $obj->getInsertedCount();
  $obj->getInsertedId();
} catch (\MongoDB\Exception\InvalidArgumentExceptio $e) {
} catch (\Exception $e) {
  $obj = $e->getWriteResult();
  $data_1 = $obj->getWriteErrors();
  $data_2 = $obj->getInsertedCount();
  $data_3 = $obj->getUpsertedIds();
}

整體上和官方文件描述沒有太大的差異。

參考:

  • https://www.php.net/mongodb-driver-writeexception.getwriteresult
  • https://www.php.net/class.mongodb-driver-writeresult
  • https://docs.mongodb.com/manual/reference/method/db.collection.insertMany/
  • https://docs.mongodb.com/php-library/v1.4/reference/method/MongoDBCollection-insertMany/

總結

到此這篇關於MongoDB CRUD操作中的插入的文章就介紹到這了,更多相關MongoDB CRUD操作插入內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!