mongoDB的CRUD的總結

今天開始接觸非關係型數據庫的mongoDB,如今將本身作的筆記發出來,供你們參考,也便於本身之後忘記了能夠查看。 首先,mongoDB,是一種數據庫,可是又區別與mysql,sqlserver、orcle等關係數據庫,在優點上面也略高一籌;至於爲何會這麼說呢?很簡單,咱們來舉兩個例子: 1.在存儲上面,非關係型數據庫能夠更大規模的存儲,打個比方,Facebook用的數據庫就是非關係型數據庫。 2.運用起來更加流暢也是這個數據庫的優勢,將分佈式的特色發揮到極致。 當我查看官方文檔的時候,簡直要人命,光是一個插入方法都講了好幾條,腦殼都大了,如今我總結一下每一插入方法的特性html

db.collection.insert()

db.collection.insert() 向集合插入一個或多個文檔.要想插入一個文檔,傳遞一個文檔給該方法;要想插入多個文檔,就能夠採用該方法。 例如mysql

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

若是插入成功就會返回sql

WriteResult({ "nInserted" : 3 })

若是異常狀況,那麼就會返回以下咯:mongodb

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",
       age: 19,
       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",
       age: 42,
       type: 1,
       status: "A",
       favorites: { artist: "Miro", food: "meringue" },
       finished: [ 11, 25 ],
       badges: [ "green" ],
       points: [
          { points: 85, bonus: 20 },
          { points: 64, bonus: 12 }
       ]
     },
     {
       _id: 3,
       name: "ahn",
       age: 22,
       type: 2,
       status: "A",
       favorites: { artist: "Cassatt", food: "cake" },
       finished: [ 6 ],
       badges: [ "blue", "Picasso" ],
       points: [
          { points: 81, bonus: 8 },
          { points: 55, bonus: 20 }
       ]
     },
     {
       _id: 4,
       name: "xi",
       age: 34,
       type: 2,
       status: "D",
       favorites: { artist: "Chagall", food: "chocolate" },
       finished: [ 5, 11 ],
       badges: [ "Picasso", "black" ],
       points: [
          { points: 53, bonus: 15 },
          { points: 51, bonus: 15 }
       ]
     },
     {
       _id: 5,
       name: "xyz",
       age: 23,
       type: 2,
       status: "D",
       favorites: { artist: "Noguchi", food: "nougat" },
       finished: [ 14, 6 ],
       badges: [ "orange" ],
       points: [
          { points: 71, bonus: 20 }
       ]
     },
     {
       _id: 6,
       name: "abc",
       age: 43,
       type: 1,
       status: "A",
       favorites: { food: "pizza", artist: "Picasso" },
       finished: [ 18, 12 ],
       badges: [ "black", "blue" ],
       points: [
          { points: 78, bonus: 8 },
          { points: 57, bonus: 7 }
       ]
     }
   ]
)

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

既然增了,就得查找,對吧,查找裏面呢也有不少小東西,有許多本身自定義查詢。 一、查詢所有sqlserver

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

二、指定等於條件 一個 query filter document 可使用 <field>:<value> 表達式指定等於條件以選擇全部包含 <field> 字段而且等於特定 <value> 的全部文檔:性能

下面的示例從 user 集合中檢索 status 字段值爲 "P" 或者 "D" 的全部文檔:學習

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

三、指定 AND 條件 複合查詢能夠在集合文檔的多個字段上指定條件。隱含地,一個邏輯的 AND 鏈接詞會鏈接複合查詢的子句,使得查詢選出集合中匹配全部條件的文檔。

下面的示例在 users 集合中檢索 status 等於 "A"``**而且** ``age 小於 ($lt) 30是全部文檔:

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

四、指定 OR 條件 經過使用 $or 操做符,你能夠指定一個使用邏輯 OR 鏈接詞鏈接各子句的複合查詢選擇集合中匹配至少一個條件的文檔。

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

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

五、指定 AND 和 OR 條件(能夠更加精確的查詢) 在下面的示例中,複合查詢文檔選擇集合中status`` 等於 "A" 而且 要麼 age 小於 ($lt) 30 要麼 type 等於 1 的全部文檔:

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

六、嵌入文檔上的精確匹配 使用{ <field>: <value> }而且 「<value>」 爲要匹配文檔的查詢文檔,來指定匹配整個內嵌文檔的徹底相等條件.(要使)相等條件匹配上內嵌文檔須要指定 <value> 包括字段順序的 精確 匹配。

在下面的例子中,查詢匹配全部 favorites 字段是以該種順序只包含 等於 "Picasso"``的 ``artist 和等於 "pizza" 的 food 字段的內嵌文檔:

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

七、嵌入文檔中字段上的等於匹配 在下面的例子中,查詢使用 dot notation 匹配全部 favorites 字段是包含等於 "Picasso" 的字段 ``artist``(可能還包含其餘字段) 的內嵌文檔:

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

八、數組上的查詢 採用一個參數: $elemMatch (該參數是值精確的數組) 下面的例子查詢 finished 數組至少包含一個大於 ($gt) 15 而且小於 ($lt) 20 的元素的文檔:

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

九、嵌入文檔數組 使用數組索引匹配嵌入文檔中的字段 在下面的例子中,查詢使用 the dot notation 匹配全部 dadges 是第一個元素爲」black」 的數組的文檔:

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

十、不指定數組索引匹配字段 若是你不知道文檔在數組中的索引位置,用點號 (.) 將包含數組的字段的名字和內嵌文檔的字段的名字連起來。

下面的例子選擇出全部 points``數組中至少有一個嵌入文檔包含值小於或等於 ``55 的字段 points 的文檔:

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

十一、指定數組文檔的多個查詢條件 單個元素知足查詢條件 使用 $elemMatch 操做符爲數組元素指定複合條件,以查詢數組中至少一個元素知足全部指定條件的文檔。

下面的例子查詢 points 數組有至少一個包含 points 小於等於 70 而且字段 bonus 等於 20 的內嵌文檔的文檔:

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

十二、元素組合知足查詢條件 下面的例子查詢了 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 而且 沒有文檔匹配指定的過濾器,那麼此操做會建立一個新文檔並插入它。若是有匹配的文檔,那麼此操做修改或替換匹配的單個或多個文檔。 這個解釋在我認爲就是在沒有該數據的時候就會建立相應的數據,畢竟它是插入的一種特殊方法。

一、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 },
    
   }
)

二、db.collection.update()的用法和db.collection.updateOne()相似,爲了區別一下,咱們採用了 { multi: true }這個參數,這樣會在你修改以後的數據中有這個參數,表示修改完成。

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

三、 db.collection.updateMany(),這個會不會認爲是修改不少,固然能夠這麼理解,可是我更喜歡把他理解成修改多個參數。 下面這個舉例就是爲了你們看的明白採用了{ upsert: true },它能夠清晰的返回你修改後的值

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

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

db.users.replaceOne(
   { name: "abc" },
   { name: "amy", age: 34, type: 2, status: "P", favorites: { "artist": "Dali", food: "donuts" } }
)

走着,擼刪除了: 一、刪除全部文檔db.collection.remove() 這個方法就乾脆了,就至關於sql中的刪除表結構的delete()

db.users.remove({})

做爲另外一種選擇以下例子使用 db.collection.remove() 從 users 集合中刪除全部 status 字段等於 "A" 的文檔:

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

二、僅刪除一個知足條件的文檔db.collection.deleteOne() 以下例子使用 db.collection.deleteOne() 刪除 第一個 status 字段等於 "A" 的文檔:

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

三、刪除集合中全部文檔db.collection.deleteMany() 以下的例子使用 db.collection.deleteMany() 方法從 users 集合中刪除了 全部 文檔:

db.users.deleteMany({})

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

原文出處:https://www.cnblogs.com/XSdao/p/11339092.html

相關文章
相關標籤/搜索