1. 程式人生 > 資料庫 >mongoDB中CRUD的深入講解

mongoDB中CRUD的深入講解

前言

今天開始接觸非關係型資料庫的mongoDB,現在將自己做的筆記發出來,供大家參考,也便於自己以後忘記了可以檢視。

首先,mongoDB,是一種資料庫,但是又區別與mysql,sqlserver、orcle等關係資料庫,在優勢上面也略高一籌;至於為什麼會這麼說呢?很簡單,我們來舉兩個例子:

1.在儲存上面,非關係型資料庫可以更大規模的儲存,打個比方,Facebook用的資料庫就是非關係型資料庫。

2.運用起來更加流暢也是這個資料庫的優點,將分散式的特點發揮到極致。

當我檢視官方文件的時候,簡直要人命,光是一個插入方法都講了好幾條,腦袋都大了,現在我總結一下每一插入方法的特性

db.collection.insert()

db.collection.insert() 向集合插入一個或多個文件.要想插入一個文件,傳遞一個文件給該方法;要想插入多個文件,就可以採用該方法。

例如

db.users.insert(
   [
    { name: "bob",age: 42,status: "A",},{ name: "ahn",age: 22,{ name: "xi",age: 34,status: "D",}
   ]
   )

如果插入成功就會返回

WriteResult({ "nInserted" : 3 })

如果異常情況,那麼就會返回如下咯:

WriteResult({
   "nInserted" : 3,"writeConcernError" : {
    "code" : 64,"errmsg" : "waiting for replication timed out at shard-a"
   }
   })

當我們想插入一條資料的時候,採用insert的方法據比較浪費記憶體,這個時候,我們久採用插入單個的語法db.collection.insertOne() 向集合插入 單個 文件 document 舉個小列子來說明一下。

db.users.insertOne(
   {
    name: "sue",age: 19,status: "P"
   }
   )

有了單個,就肯定會有多個,那麼多個又是怎麼樣的呢?語法都很類似,db.collection.insertMany()這個語法跟上面沒有區別嘛,對不對,當然是錯的,你想,如果新增的資料是數組裡面巢狀陣列,前面兩個的方法的效能就大打折扣了,影響資料庫的效能。廢話少說,列子走一波:

db.users.insertMany(
   [
    {
    _id: 1,name: "sue",type: 1,status: "P",favorites: { artist: "Picasso",food: "pizza" },finished: [ 17,3 ],badges: [ "blue","black" ],points: [
     { points: 85,bonus: 20 },{ points: 85,bonus: 10 }
    ]
    },{
    _id: 2,name: "bob",favorites: { artist: "Miro",food: "meringue" },finished: [ 11,25 ],badges: [ "green" ],{ points: 64,bonus: 12 }
    ]
    },{
    _id: 3,name: "ahn",type: 2,favorites: { artist: "Cassatt",food: "cake" },finished: [ 6 ],"Picasso" ],points: [
     { points: 81,bonus: 8 },{ points: 55,bonus: 20 }
    ]
    },{
    _id: 4,name: "xi",favorites: { artist: "Chagall",food: "chocolate" },finished: [ 5,11 ],badges: [ "Picasso",points: [
     { points: 53,bonus: 15 },{ points: 51,bonus: 15 }
    ]
    },{
    _id: 5,name: "xyz",age: 23,favorites: { artist: "Noguchi",food: "nougat" },finished: [ 14,6 ],badges: [ "orange" ],points: [
     { points: 71,{
    _id: 6,name: "abc",age: 43,favorites: { food: "pizza",artist: "Picasso" },finished: [ 18,12 ],badges: [ "black","blue" ],points: [
     { points: 78,{ points: 57,bonus: 7 }
    ]
    }
   ]
   )

注意:insertOne()、insertMany()是3.2版本的語法。

既然增了,就得查詢,對吧,查詢裡面呢也有很多小東西,有許多自己自定義查詢。

1、查詢全部

db.users.find( {} ) 等價於db.users.find()

2、指定等於條件

一個 query filter document 可以使用 <field>:<value> 表示式指定等於條件以選擇所有包含 <field> 欄位並且等於特定 <value> 的所有文件:

下面的示例從 user 集合中檢索 status 欄位值為 “P” 或者 “D” 的所有文件:

db.users.find( { status: { $in: [ "P","D" ] } } )

3、指定 AND 條件

複合查詢可以在集合文件的多個欄位上指定條件。隱含地,一個邏輯的 AND 連線詞會連線複合查詢的子句,使得查詢選出集合中匹配所有條件的文件。

下面的示例在 users 集合中檢索 status 等於 "A"``**並且** ``age 小於 ($lt) 30是所有文件:

db.users.find( { status: "A",age: { $lt: 30 } } )

4、指定 OR 條件

通過使用 $or 操作符,你可以指定一個使用邏輯 OR 連線詞連線各子句的複合查詢選擇集合中匹配至少一個條件的文件。

下面的示例在 users 集合中檢索 status` 等於 "A"**或者**age 小於 ($lt) 30 所有文件:

db.users.find(
      {
        $or: [ { status: "A" },{ age: { $lt: 30 } } ]
      }
      )

5、指定 AND 和 OR 條件(可以更加精確的查詢)

在下面的示例中,複合查詢文件選擇集合中status`` 等於 "A" 並且 要麼 age 小於 ($lt) 30 要麼 type 等於 1 的所有文件:

db.users.find(
      {
        status: "A",$or: [ { age: { $lt: 30 } },{ type: 1 } ]
      }
      )

6、嵌入文件上的精確匹配

使用{ <field>: <value> }並且 “” 為要匹配文件的查詢文件,來指定匹配整個內嵌文件的完全相等條件.(要使)相等條件匹配上內嵌文件需要指定 包括欄位順序的 精確 匹配。

在下面的例子中,查詢匹配所有 favorites 欄位是以該種順序只包含 等於 "Picasso"``的 ``artist 和等於 "pizza" 的 food 欄位的內嵌文件:

db.users.find( { favorites: { artist: "Picasso",food: "pizza" } } )

7、嵌入文件中欄位上的等於匹配

在下面的例子中,查詢使用 dot notation 匹配所有 favorites 欄位是包含等於 "Picasso" 的欄位 ``artist``(可能還包含其他欄位) 的內嵌文件:

db.users.find( { "favorites.artist": "Picasso" } )

8、陣列上的查詢

採用一個引數: $elemMatch (該引數是值精確的陣列)

下面的例子查詢 finished 陣列至少包含一個大於 ($gt) 15 並且小於 ($lt) 20 的元素的文件:

db.users.find( { finished: { $elemMatch: { $gt: 15,$lt: 20 } } } )

9、嵌入文件陣列

使用陣列索引匹配嵌入文件中的欄位

在下面的例子中,查詢使用 the dot notation 匹配所有 dadges 是第一個元素為”black” 的陣列的文件:

db.users.find( { 'points.0.points': { $lte: 55 } } )

10、不指定陣列索引匹配欄位

如果你不知道文件在陣列中的索引位置,用點號 (.) 將包含陣列的欄位的名字和內嵌文件的欄位的名字連起來。

下面的例子選擇出所有 points``陣列中至少有一個嵌入文件包含值小於或等於 ``55 的欄位 points 的文件:

db.users.find( { 'points.points': { $lte: 55 } } )

11、指定陣列文件的多個查詢條件

單個元素滿足查詢條件

使用 $elemMatch 操作符為陣列元素指定複合條件,以查詢陣列中至少一個元素滿足所有指定條件的文件。

下面的例子查詢 points 陣列有至少一個包含 points 小於等於 70 並且欄位 bonus 等於 20 的內嵌文件的文件:

db.users.find( { points: { $elemMatch: { points: { $lte: 70 },bonus: 20 } } }

12、元素組合滿足查詢條件

下面的例子查詢了 points 陣列包含了以某種組合滿足查詢條件的元素的文件;例如,一個元素滿足 points 小於等於 70 的條件並且有另一個元素滿足 bonus 等於 20 的條件,或者一個元素同時滿足兩個條件:

db.users.find( { "points.points": { $lte: 70 },"points.bonus": 20 } )

接下來就是更新咯,老樣子跟插入方法差不多,更新就可以看做是插入的一種。

來一段官方文件的話:

如果 db.collection.update() db.collection.updateOne() db.collection.updateMany() 或者 db.collection.replaceOne() 包含 upsert : true 並且 沒有文件匹配指定的過濾器,那麼此操作會建立一個新文件並插入它。如果有匹配的文件,那麼此操作修改或替換匹配的單個或多個文件。

這個解釋在我認為就是在沒有該資料的時候就會建立相應的資料,畢竟它是插入的一種特殊方法。

1、db.collection.updateOne():修改單條資料

下面的例子對 users 集合使用 db.collection.updateOne() 方法來更新第一個 根據 過濾條件favorites.artist 等於 “Picasso” 匹配到的文件更新操作:

使用 $set 操作符更新 favorites.food 欄位的值為 “pie” 並更新 type 欄位的值為 3,

db.users.updateOne(
      { "favorites.artist": "Picasso" },{
        $set: { "favorites.food": "pie",type: 3 },}
      )

2、db.collection.update()的用法和db.collection.updateOne()類似,為了區別一下,我們採用了 { multi: true }這個引數,這樣會在你修改之後的資料中有這個引數,表示修改完成。

db.users.update(
      { "favorites.artist": "Pisanello" },{
        $set: { "favorites.food": "pizza",type: 0,}
      },{ multi: true }
      )

3、 db.collection.updateMany(),這個會不會認為是修改很多,當然可以這麼理解,但是我更喜歡把他理解成修改多個引數。

下面這個舉例就是為了大家看的明白採用了{ upsert: true },它可以清晰的返回你修改後的值

 db.inspectors.updateMany(
        { "Sector" : { $gt : 4 },"inspector" : "R. Coltrane" },{ $set: { "Patrolling" : false } },{ upsert: true }
      );

4、修改還有一個就是文件替換db.collection.replaceOne
下面的例子對 users 集合使用 db.collection.replaceOne() 方法將通過過濾條件 name 等於 "sue" 匹配到的 **第一個** 文件替換為新文件:

db.users.replaceOne(
      { name: "abc" },{ name: "amy",favorites: { "artist": "Dali",food: "donuts" } }
      )

走著,擼刪除了:

1、刪除所有文件db.collection.remove()

這個方法就乾脆了,就相當於sql中的刪除表結構的delete()

db.users.remove({})

作為另一種選擇如下例子使用 db.collection.remove() 從 users 集合中刪除所有 status 欄位等於 “A” 的文件:

db.users.remove( { status : "P" } )

2、僅刪除一個滿足條件的文件db.collection.deleteOne()

如下例子使用 db.collection.deleteOne() 刪除 第一個 status 欄位等於 “A” 的文件:

db.users.deleteOne( { status: "D" } )

3、刪除集合中所有文件db.collection.deleteMany()

如下的例子使用 db.collection.deleteMany() 方法從 users 集合中刪除了 所有 文件:

db.users.deleteMany({})

以上是通過兩天學習官方文達能的總結,下面配上官方文件的地址表示感謝。
https://docs.mongodb.com/manual/reference/method/js-collection/

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。