前言
今天開始接觸非關系型數據庫的mongoDB,現在將自己做的筆記發出來,供大家參考,也便于自己以后忘記了可以查看。
首先,mongoDB,是一種數據庫,但是又區別與mysql,sqlserver、orcle等關系數據庫,在優勢上面也略高一籌;至于為什么會這么說呢?很簡單,我們來舉兩個例子:
1.在存儲上面,非關系型數據庫可以更大規模的存儲,打個比方,Facebook用的數據庫就是非關系型數據庫。
2.運用起來更加流暢也是這個數據庫的優點,將分布式的特點發揮到極致。
當我查看官方文檔的時候,簡直要人命,光是一個插入方法都講了好幾條,腦袋都大了,現在我總結一下每一插入方法的特性
1
|
db.collection. insert () |
db.collection.insert()
向集合插入一個或多個文檔.要想插入一個文檔,傳遞一個文檔給該方法;要想插入多個文檔,就可以采用該方法。
例如
1
2
3
4
5
6
7
|
db.users. insert ( [ { name : "bob" , age: 42, status: "A" , }, { name : "ahn" , age: 22, status: "A" , }, { name : "xi" , age: 34, status: "D" , } ] ) |
如果插入成功就會返回
1
|
WriteResult({ "nInserted" : 3 }) |
如果異常情況,那么就會返回如下咯:
1
2
3
4
5
6
7
|
WriteResult({ "nInserted" : 3, "writeConcernError" : { "code" : 64, "errmsg" : "waiting for replication timed out at shard-a" } }) |
當我們想插入一條數據的時候,采用insert的方法據比較浪費內存,這個時候,我們久采用插入單個的語法db.collection.insertOne()
向集合插入 單個 文檔 document 舉個小列子來說明一下。
1
2
3
4
5
6
7
|
db.users.insertOne( { name : "sue" , age: 19, status: "P" } ) |
有了單個,就肯定會有多個,那么多個又是怎么樣的呢?語法都很類似,db.collection.insertMany()
這個語法跟上面沒有區別嘛,對不對,當然是錯的,你想,如果添加的數據是數組里面嵌套數組,前面兩個的方法的性能就大打折扣了,影響數據庫的性能。廢話少說,列子走一波:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
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版本的語法。
既然增了,就得查找,對吧,查找里面呢也有很多小東西,有許多自己自定義查詢。
1、查詢全部
1
|
db.users.find( {} ) 等價于db.users.find() |
2、指定等于條件
一個 query filter document 可以使用 <field>:<value> 表達式指定等于條件以選擇所有包含 <field> 字段并且等于特定 <value> 的所有文檔:
下面的示例從 user 集合中檢索 status 字段值為 “P” 或者 “D” 的所有文檔:
1
|
db.users.find( { status: { $ in : [ "P" , "D" ] } } ) |
3、指定 AND 條件
復合查詢可以在集合文檔的多個字段上指定條件。隱含地,一個邏輯的 AND 連接詞會連接復合查詢的子句,使得查詢選出集合中匹配所有條件的文檔。
下面的示例在 users 集合中檢索 status 等于 "A"``**并且** ``age 小于 ($lt) 30是所有文檔:
1
|
db.users.find( { status: "A" , age: { $lt: 30 } } ) |
4、指定 OR 條件
通過使用 $or 操作符,你可以指定一個使用邏輯 OR 連接詞連接各子句的復合查詢選擇集合中匹配至少一個條件的文檔。
下面的示例在 users 集合中檢索 status` 等于 "A"**或者**age 小于 ($lt) 30 所有文檔:
1
2
3
4
5
|
db.users.find( { $ or : [ { status: "A" }, { age: { $lt: 30 } } ] } ) |
5、指定 AND 和 OR 條件(可以更加精確的查詢)
在下面的示例中,復合查詢文檔選擇集合中status`` 等于 "A" 并且 要么 age 小于 ($lt) 30 要么 type 等于 1 的所有文檔:
1
2
3
4
5
6
|
db.users.find( { status: "A" , $ or : [ { age: { $lt: 30 } }, { type: 1 } ] } ) |
6、嵌入文檔上的精確匹配
使用{ <field>: <value> }并且 “” 為要匹配文檔的查詢文檔,來指定匹配整個內嵌文檔的完全相等條件.(要使)相等條件匹配上內嵌文檔需要指定 包括字段順序的 精確 匹配。
在下面的例子中,查詢匹配所有 favorites 字段是以該種順序只包含 等于 "Picasso"``的 ``artist 和等于 "pizza" 的 food 字段的內嵌文檔:
1
|
db.users.find( { favorites: { artist: "Picasso" , food: "pizza" } } ) |
7、嵌入文檔中字段上的等于匹配
在下面的例子中,查詢使用 dot notation 匹配所有 favorites 字段是包含等于 "Picasso" 的字段 ``artist``(可能還包含其他字段) 的內嵌文檔:
1
|
db.users.find( { "favorites.artist" : "Picasso" } ) |
8、數組上的查詢
采用一個參數: $elemMatch (該參數是值精確的數組)
下面的例子查詢 finished 數組至少包含一個大于 ($gt) 15 并且小于 ($lt) 20 的元素的文檔:
1
|
db.users.find( { finished: { $elemMatch: { $gt: 15, $lt: 20 } } } ) |
9、嵌入文檔數組
使用數組索引匹配嵌入文檔中的字段
在下面的例子中,查詢使用 the dot notation 匹配所有 dadges 是第一個元素為”black” 的數組的文檔:
1
|
db.users.find( { 'points.0.points' : { $lte: 55 } } ) |
10、不指定數組索引匹配字段
如果你不知道文檔在數組中的索引位置,用點號 (.) 將包含數組的字段的名字和內嵌文檔的字段的名字連起來。
下面的例子選擇出所有 points``數組中至少有一個嵌入文檔包含值小于或等于 ``55 的字段 points 的文檔:
1
|
db.users.find( { 'points.points' : { $lte: 55 } } ) |
11、指定數組文檔的多個查詢條件
單個元素滿足查詢條件
使用 $elemMatch 操作符為數組元素指定復合條件,以查詢數組中至少一個元素滿足所有指定條件的文檔。
下面的例子查詢 points 數組有至少一個包含 points 小于等于 70 并且字段 bonus 等于 20 的內嵌文檔的文檔:
1
|
db.users.find( { points: { $elemMatch: { points: { $lte: 70 }, bonus: 20 } } } |
12、元素組合滿足查詢條件
下面的例子查詢了 points 數組包含了以某種組合滿足查詢條件的元素的文檔;例如,一個元素滿足 points 小于等于 70 的條件并且有另一個元素滿足 bonus 等于 20 的條件,或者一個元素同時滿足兩個條件:
1
|
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,
1
2
3
4
5
6
7
|
db.users.updateOne( { "favorites.artist" : "Picasso" }, { $ set : { "favorites.food" : "pie" , type: 3 }, } ) |
2、db.collection.update()
的用法和db.collection.updateOne()
類似,為了區別一下,我們采用了 { multi: true }這個參數,這樣會在你修改之后的數據中有這個參數,表示修改完成。
1
2
3
4
5
6
7
|
db.users. update ( { "favorites.artist" : "Pisanello" }, { $ set : { "favorites.food" : "pizza" , type: 0, } }, { multi: true } ) |
3、 db.collection.updateMany(),這個會不會認為是修改很多,當然可以這么理解,但是我更喜歡把他理解成修改多個參數。
下面這個舉例就是為了大家看的明白采用了{ upsert: true },它可以清晰的返回你修改后的值
1
2
3
4
5
|
db.inspectors.updateMany( { "Sector" : { $gt : 4 }, "inspector" : "R. Coltrane" }, { $ set : { "Patrolling" : false } }, { upsert: true } ); |
4、修改還有一個就是文檔替換db.collection.replaceOne
下面的例子對 users 集合使用 db.collection.replaceOne() 方法將通過過濾條件 name 等于 "sue" 匹配到的 **第一個** 文檔替換為新文檔:
1
2
3
4
|
db.users.replaceOne( { name : "abc" }, { name : "amy" , age: 34, type: 2, status: "P" , favorites: { "artist" : "Dali" , food: "donuts" } } ) |
走著,擼刪除了:
1、刪除所有文檔db.collection.remove()
這個方法就干脆了,就相當于sql中的刪除表結構的delete()
1
|
db.users.remove({}) |
作為另一種選擇如下例子使用 db.collection.remove()
從 users 集合中刪除所有 status 字段等于 “A” 的文檔:
1
|
db.users.remove( { status : "P" } ) |
2、僅刪除一個滿足條件的文檔db.collection.deleteOne()
如下例子使用 db.collection.deleteOne()
刪除 第一個 status 字段等于 “A” 的文檔:
1
|
db.users.deleteOne( { status: "D" } ) |
3、刪除集合中所有文檔db.collection.deleteMany()
如下的例子使用 db.collection.deleteMany()
方法從 users 集合中刪除了 所有 文檔:
1
|
db.users.deleteMany({}) |
以上是通過兩天學習官方文達能的總結,下面配上官方文檔的地址表示感謝。
https://docs.mongodb.com/manual/reference/method/js-collection/
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。
原文鏈接:https://www.cnblogs.com/XSdao/p/11339092.html