基礎
- use db 選擇數據庫
- 創(chuàng)建數據庫崭歧。當數據庫不存在時祈匙,第一次使用并且存數數據時魏保,創(chuàng)建數據庫澡为。如
use myDb
db.myNewCollection1.insert({value: 10})
創(chuàng)建數據庫myDb, 創(chuàng)建myNewCollection1
注意: mongodb中的collection類似于關系數據庫中的table,通常情況下不需要使用db.createCollection()顯示的構建collection
- 限制集景埃。官方文檔中給的例子說明是用于log記錄媒至,個人理解:主要目的是限定存儲空間的數據集,當文檔數據超過指定空間或指定文檔最大數之后谷徙,刪除最老的數據拒啰。
- _id. 每個document都存在一個_id, 必須保持每個document的_id唯一并且不可更改,個人理解:最好是在增加document時完慧,用一個_id生成器生成_id谋旦,確保每個_id唯一。(糾正想法:又查看了_id設計思路屈尼,發(fā)現自己的思路是錯的册着,mongodb將_id設計成12字節(jié)是有道理的,4字節(jié)時間戳+3字節(jié)機器碼+2字節(jié)PID+3字節(jié)計數器脾歧,保證分布式系統(tǒng)中的每個_id值唯一甲捏,默認情況下,用默認的生成的_id就ok了)
常見操作
CRUD
create操作
- db.collection.insert()
- db.collection.insertOne()
- db.collection.insertMany()
query操作
查詢操作是最常用的操作鞭执,其一般形式為:
db.collection.find(<query filter>, <projection>)
query filter表示查詢條件司顿,projection表示查詢返回的元素
eg: db.user.find({}) === db.user.find()
以下是例子(摘自官方文檔)
db.users.find( { status: "A" } )
db.users.find( { status: { $in: [ "P", "D" ] } } )
db.users.find( { status: "A", age: { $lt: 30 } } )
db.users.find( { $or: [ { status: "A" }, { age: { $lt: 30 } } ] })
db.users.find( { status: "A", $or: [ { age: { $lt: 30 } }, { type: 1 } ] })
db.users.find( { favorites: { artist: "Picasso", food: "pizza" } } )
db.users.find( { "favorites.artist": "Picasso" } )
db.users.find( { badges: [ "blue", "black" ] } )// 數組完全匹配
db.users.find( { badges: "black" } ) // 數組中存在一個為"black"的元素
db.users.find( { "badges.0": "black" } )// 數組的第一個元素為“black”
db.users.find( { finished: { $elemMatch: { $gt: 15, $lt: 20 } } } )// 只要數組中存在某個元素滿足所有條件
db.users.find( { finished: { $gt: 15, $lt: 20 } } ) // 表示finish數組中的所有元素必須滿足其中的某個條件,并且條件組合中的每個條件在數組中必然存在某個元素滿足
db.users.find( { 'points.0.points': { $lte: 55 } } )//數組中的精確匹配兄纺,在明確知道數組的順序時使用比較合適
db.users.find( { 'points.points': { $lte: 55 } } )// 在不清楚數組順序時使用
db.users.find( { points: { $elemMatch: { points: { $lte: 70 }, bonus: 20 } } } )// 至少有一個元素滿足復合條件
db.users.find( { "points.points": { $lte: 70 }, "points.bonus": 20 } )
projection表示返回的元素大溜,通常,其說明為:
{ field1: <value>, field2: <value> ... }
value值可為0或1估脆,當為0或false時表示返回值不出現钦奋,當為1或true時表示返回值出現
在查詢中一個不可忽略的問題是關于null,如下面這個例子
db.users.find( { name: null } ) // 查詢結果既包括name值為null的document,也包括不存在name屬性的document锨苏,容易造成誤解疙教,為了應對這種情況,有兩個方法:
db.users.find( { name : { $type: 10 } } ) // 精確表示name為null
db.users.find( { name : { $exists: false } } ) // 精確表示不存在name屬性的document
update
這一操作相對比較簡單伞租,主要有以下集中用法贞谓。(注:upset選項)
db.collection.update()
db.collection.updateOne()
db.collection.updateMany()
db.collection.replaceOne()
delete
刪除操作與update有些類似,主要的用法:
db.collection.remove()
db.collection.deleteOne()
db.collection.deleteMany()
bulk操作
bulk操作用于批量(大量)執(zhí)行一系列的操作葵诈,提供的主要方法是bulkWrite()裸弦,批量執(zhí)行有兩種情形(個人理解):
- 有序執(zhí)行。有序執(zhí)行一個操作失敗時作喘,后續(xù)操作不在執(zhí)行
- 無序執(zhí)行理疙。無序執(zhí)行時,允許并發(fā)操作泞坦,當一個操作執(zhí)行失敗時窖贤,其它操作依然執(zhí)行,但是也存在風險贰锁。