mongodb想速成嗎,這個系列教程你能夠看看(2)mongodb
MongoDB 是由C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。shell
在高負載的狀況下,添加更多的節點,能夠保證服務器性能。數據庫
MongoDB 旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。json
MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組windows
www.mongodb.com/download-ce… 選擇適合本身的版本。 數組
網站數據、緩存等大尺寸、低價值的數據緩存
在高伸縮性的場景,用於對象及JSON數據的存儲。bash
數據庫服務器
MongoDB的一個實例能夠擁有一個或多個相互獨立的數據庫,每一個數據庫都有本身的集合。數據結構
集合
集合能夠看做是擁有動態模式的表。
文檔
文檔是MongoDB中基本的數據單元,相似於RDB的行。文檔是鍵值對的一個有序集合。在JS中,文檔被表示成對象。
_id
每一個文檔都有個特殊的「_id」,在文檔所屬集合中是惟一的。
JavaScript shell
MongoDB自帶了一個功能強大的JavaScript Shell,能夠用於管理或操做MongoDB
舉例
添加服務 在命令行工具裏
mongod.exe --dbpath E:\mongodata --logpath E:\mongolog --logappend --directoryperdb --serviceName mongodb --install
複製代碼
啓動mongodb服務
mongod --dbpath=E:\Mongodb\data
複製代碼
若是出現waiting for connections on port 27017就表示啓動成功,已經在27017端口上監聽了客戶端的請求注:啓動說明
選項 | 含義 |
---|---|
--port | 指定服務端口號,默認端口27017 |
--logpath | 指定MongoDB日誌文件,注意是指定文件不是目錄 |
--logappend | 使用追加的方式寫日誌 |
--dbpath | 指定數據庫路徑 |
--directoryperdb | 設置每一個數據庫將被保存在一個單獨的目錄 |
接着,再打開一個新的命令行窗口,輸入
mongo
複製代碼
就能夠連接到數據庫了
最後介紹一款mongodb可視化工具 Studio3T
use database_name
// 例如咱們這裏能夠建一個叫school的數據庫
use school
複製代碼
database_name 表明數據庫的名字
注:若是此數據庫存在,則切換到此數據庫下,若是此數據庫還不存在也能夠切過來,可是並不能馬上建立數據庫 切換到 school數據庫下
show dbs
複製代碼
備註: 咱們剛建立的數據庫school若是不在列表內, 要顯示它,咱們須要向school數據庫插入一些數據 db.students.insert({age:1});
inert數據以後
db
複製代碼
注:db表明的是當前數據庫 也就是school這個數據庫
db.dropDatabase()
複製代碼
school數據庫就沒了
use demo
db.demo.help()
複製代碼
db.createCollection(collection_Name)
複製代碼
collection_Name集合的名稱
collection_Name集合的名稱 document要插入的文檔
db.collection_Name.insert(document)
// 例如
db.demo.insert({age:1})
複製代碼
注:上圖裏的objectId是有規律的,規律以下
以前咱們使用MySQL等關係型數據庫時,主鍵都是設置成自增的。但在分佈式環境下,這種方法就不可行了,會產生衝突。爲此,MongoDB採用了一個稱之爲ObjectId的類型來作主鍵。ObjectId是一個12字節的 BSON 類型字符串。按照字節順序,一次表明:
- | - |
---|---|
4字節: | UNIX時間戳 |
3字節: | 表示運行MongoDB的機器 |
2字節: | 表示生成此_id的進程 |
3字節: | 由一個隨機數開始的計數器生成的值 |
show collections
複製代碼
db.getName() 或者 db
複製代碼
db.dropDatabase()
複製代碼
db.collection_name.insert(document);
複製代碼
collection_name 集合的名字
document 插入的文檔
注:每當插入一條新文檔的時候mongodb會自動爲此文檔生成一個_id屬性,_id必定是惟一的,用來惟一標識一個文檔 _id也能夠直接指定,但若是數據庫中此集合下已經有此_id的話插入會失敗
db.demo.insert({_id:1,age:1});
複製代碼
db.collection_name.save(document)
複製代碼
collection_name 集合的名字 document 插入的文檔
注:若是不指定 _id 字段 save() 方法相似於 insert() 方法。若是指定 _id 字段,則會更新該 _id 的數據。 咱們save以前保存過的id=1的數據,看是否是更新了此條數據
db.demo.save({_id:1, age:2})
複製代碼
db.collection.update(
<query>,
<updateObj>,
{
upsert: <boolean>,
multi: <boolean>
}
)
複製代碼
參數 | - |
---|---|
query | 查詢條件,指定要更新符合哪些條件的文檔 |
update | 更新後的對象或指定一些更新的操做符 |
$set | 在原基礎上累加 |
upsert | 可選,這個參數的意思是,若是不存在符合條件的記錄時是否插入updateObj. 默認是false,不插入。 |
multi | 可選,mongodb 默認只更新找到的第一條記錄,若是這個參數爲true,就更新全部符合條件的記錄。 |
db.demo.insert({name: 'zhangsan'});
db.demo.update({name:'zhangsan'},{age:12})
複製代碼
將students集合中數據中name是lisi的值修改成lisi,由於原表根本不存在name:lisi的,本來不會插入這一條數據,可是upsert選項設爲了true就插入成功了
db.demo.update({name:'lisi'}, {name:'lisi'}, {upsert:true});
複製代碼
若是有多條age是1的數據只更新一條,若是想所有更新須要指定{multi:true}的參數
db.school.insert({age:1});
db.school.insert({age:1});
db.school.insert({age:1});
db.school.update({age:1}, {$set:{name:'lisi'}}, {multi:true});
db.school.find({})
複製代碼
直接指定更新後的值
use c3;
db.c3.insert({name:'a'});
db.c3.update({name:'a'},{$set:{age:10}});
db.c3.find({})
複製代碼
在原基礎上累加
db.c3.update({name:'a'},{$inc:{age:1}});
複製代碼
刪除指定的鍵
db.c3.update({name:'2'},{$unset:{age:11}});
複製代碼
向數組中添加元素
var result = db.student.update({name:'張三'},{
$push:{"hobbys":"smoking"}
});
複製代碼
$ne相似於MYSQL的 not in 或者not exists
db.c3.update({hobbys:{$ne:"eating"}},{$push:{"hobbys":"sleeping"}});
複製代碼
向集合中添加元素
db.c3.update({a:1},{$addToSet:{"hobbys":"smoking"}});
複製代碼
把數組中的元素逐個添加到集合中
db.a.insert({name:'a', hobbys:[1,2]});
db.a.update({name:'a'},{$addToSet:{hobbys:{$each:[3,4]}}});
db.a.find()
複製代碼
從數組中移除指定的索引中對應的元素
db.c3.update({name:'a'},{$pop:{hobbys:1}});
db.c3.find()
複製代碼
db.c3.update({name:'zfpx1'},{$set:{"hobbys.0":"smoking2"}});
複製代碼
remove方法是用來移除集合中的數據
db.collection.remove(
<query>,
{
justOne: <boolean>
}
)
複製代碼
- | - |
---|---|
query | (可選)刪除的文檔的條件。 |
justOne | (可選)若是設爲 true 或 1,則只刪除匹配到的多個文檔中的第一個 |
刪除worker集合裏name是zfpx2的全部文檔數據
db.c3.remove({name:'a'});
複製代碼
即便匹配多條也只刪除一條
db.c3.remove({name:'a'},{justOne:true});
複製代碼
語法
db.collection_name.find()
複製代碼
參數
- | - |
---|---|
collection_name | 集合的名字 |
實例
查詢c3下全部的文檔
db.students.find()
複製代碼
語法
db.collection_name.find({queryWhere},{key:1,key:1})
複製代碼
參數列表
- | - |
---|---|
collection_name | 集合的名字 |
queryWhere | 參閱查詢條件操做符 |
key | 指定要返回的列 |
1 | 表示要顯示 |
實例
只返回顯示age列
db.c3.insert([{name:1,age:2},{name:1,age:3},{name:1,age:4}]);
db.c3.find({},{_id:0, age:1});
複製代碼
查詢匹配結果的第一條數據 語法
db.collection_name.findOne()
複製代碼
實例
db.c3.findOne()`
複製代碼
查詢字段在某個範圍內
db.c3.insert([{age:30, name:1},{age:100, name:2},{age:40, name:3},{age:60, name:4}])
db.c3.find({age:{$in:[30,100]}},{name:1,age:1});
複製代碼
查詢字段不在某個範圍內
db.c3.find({age:{$nin:[30,100]}},{name:1,age:1});
複製代碼
對特定條件取反
db.c3.find({age:{$not:{$gte:20,$lte:30}}});
複製代碼
對數組的查詢
// 按全部元素匹配
db.c3.find({friends:[ "A", "B", "C", "D" ]});
//匹配一項 包含A的就能夠
db.c3.find({friends:"A"});
// $all 必須同時包含A B
db.c3.find({friends:{$all:['A',"B"]}});
// $in 或者關係 ,包含A或者B
db.c3.find({friends:{$in:['A',"B"]}});
//$size 按數組的長度去匹配
db.c3.find({friends:{$size:4}});
//$slice 只返回數組中的某一部分
db.c3.find({friends:{$size:5}},{name:1,friends:{$slice:2}});
db.c3.find({friends:{$size:5}},{name:1,friends:{$slice:-2}});
$slice:["$array", [startIndex, ] length ] (startIndex能夠省略,默認從0開始)
db.c3.find({},{friends:{$slice:[0,3]}});
複製代碼
db.c3.find({$where:"this.age>30"},{name:1,age:1});
複製代碼
遊標不是查詢結果,而是查詢的一個返回資源或者接口,經過這個接口,能夠逐條讀取數據
var result = db.student.find();
while(result.hasNext()){
printjson(result.next());
}
複製代碼
條件操做符用於比較兩個表達式並從mongoDB集合中獲取數據
參數
- | - |
---|---|
$gt | 大於 |
$gte | 大於等於 |
$lt | 小於 |
$lte | 小於等於 |
語法
db.collectoin_name.find({"_id" : ObjectId("value")})
複製代碼
查詢_id是 562af23062d5a57609133974 數據
db.stuc3dents.find({_id:ObjectId("5adb666ecd738e9771638985")});
複製代碼
語法
db.collectoin_name.find().count();
複製代碼
db.c3.find().count()
複製代碼
語法
db.collection.find({key:/value/})
複製代碼
參數
- | - |
---|---|
collectoin_name | 集合名稱 |
key | 字段 |
value | 值 |
查詢name裏包含joe的數據,正則只能匹配字符串
db.user.find({name:/joe/})
複製代碼
find方法能夠傳入多個鍵(key),每一個鍵(key)以逗號隔開
語法
db.collection_name.find({key1:value1, key2:value2})
複製代碼
查詢name是1而且age是30的數據
db.students.find({name:1,age:30})
複製代碼
語法
db.collection_name.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
)
複製代碼
查詢age = 30 或者 age = 100 的數據
db.c3.find({$or:[{age:30},{age:100}]})
複製代碼
語法
db.collection_name.find(
{
key1:value1,
key2:value2,
$or: [
{key1: value1},
{key2:value2}
]
}
)
複製代碼
實例 查詢 age是30 而且 name是1或者 name是 3 的數據
db.c3.find({age: 30, $or:[{name:1},{age:3}]})
複製代碼
讀取指定數量的數據記錄 語法
db.collectoin_name.find().limit(number)
複製代碼
var a = [];
for(var i = 0;i<10;i++){
a.push({age:i})
};
db.c3.insert(a);
db.students.find().limit(3)
複製代碼
跳過指定數量的數據,skip方法一樣接受一個數字參數做爲跳過的記錄條數 語法
db.collectoin_name.find().skip(number)
複製代碼
db.c3.find().skip(3)
複製代碼
一般用這種方式來實現分頁功能 語法
db.collectoin_name.find().skip(skipNum).limit(limitNum)
複製代碼
db.c3.find().skip(3).limit(3);
複製代碼
sort()方法能夠經過參數指定排序的字段,並使用 1 和 -1 來指定排序的方式,其中 1 爲升序排列,而-1是用於降序排列。 語法
db.collectoin_name.find().sort({key:1})
db.collectoin_name.find().sort({key:-1})
複製代碼
db.c3
![](https://user-gold-cdn.xitu.io/2019/4/9/169fff28b40c6b57?w=502&h=220&f=jpeg&s=21589).find().sort({age:1})
複製代碼