1.邏輯結構與關係數據庫的對比:
關係型數據庫 |
MongoDb |
database(數據庫) |
database(數據庫) |
table (表) |
collection( 集合) |
row( 行) |
document( BSON 文檔) |
column (列) |
field (字段) |
index(唯一索引、主鍵索引) |
index (全文索引) |
join (主外鍵關聯) |
embedded Document (嵌套文檔) |
primary key(指定1至N個列做主鍵) |
primary key (指定_id field做爲主鍵) |
aggreation(groupy) |
aggreation (pipeline mapReduce) |
2.體系結構:
.
2.mongoDb啓動參數說明
mongoDb 由C++編寫,下載下來的包可以直接啓動
#創建數據庫目錄
mkdir -p /data/mongo
# 啓動mongo
./bin/mongod --dbpath=/data/mongo/
常規參數
參數 |
說明 |
dbpath |
數據庫目錄,默認/data/db |
bind_ip |
監聽IP地址,默認全部可以訪問 |
port |
監聽的端口,默認27017 |
logpath |
日誌路徑 |
logappend |
是否追加日誌 |
auth |
是開啓用戶密碼登陸 |
fork |
是否已後臺啓動的方式登陸 |
config |
指定配置文件 |
配置文件示例
vim mongo.conf
內容:
dbpath=/data/mongo/
port=27017
bind_ip=0.0.0.0
fork=true
logpath = /data/mongo/mongodb.log
logappend = true
auth=false
已配置文件方式啓動
./bin/mongod -f mongo.conf
mongo shell 是一個js 控臺,可以執行js 相關運算如:
> 1+1
2
> var i=123;
> print(i)
123
>
4.數據庫與集合的基礎操作
#查看數據庫
show dbs;
#切換數據庫
use luban;
#創建數據庫與集合,在插入數據時會自動 創建數據庫與集和
db.friend.insertOne({name:"wukong",sex:"man"});
#查看集合
show tables;
show collections;
#刪除集合
db.friend.drop();
#刪除數據庫
db.dropDatabase();
三、MongoDB CRUD與全文索引
概要:
- 數據的新增的方式
- 數據的查詢
- 數據的修改刪除
- 全文索引查詢
- 數據的新增的方式
關於Mongodb數據插入的說明
- 數據庫的新增不需要序先設計模型結構,插入數據時會自動創建。
- 同一個集合中不同數據字段結構可以不一樣
插入相關方法:
//插入單條
db.friend.insertOne({name:"wukong",sex:"man"});
// 插入多條
db.friend.insertMany([
{name:"wukong",sex:"man"},{name:"diaocan",sex:"woman",age:18,birthday:new Date("1995-11-02")},{name:"zixiao",sex:"woman"}
]);
// 指定ID
db.friend.insert([
{_id:1,name:"wokong",sex:"man",age:1},
{_id:2,name:"diaocan",sex:"women",birthday:new Date("1988-11- 11")}
])
2、數據的查詢
概要:
-
- 基於條件的基礎查詢
- $and、$or、$in、$gt、$gte、$lt、$lte 運算符
- 基於 sort skip limit 方法實現排序與分頁
- 嵌套查詢
- 數組查詢
- 數組嵌套查詢
基礎查詢:
#基於ID查找
db.emp.find({_id:1101})
#基於屬性查找
db.emp.find({"name":"魯班"})
# && 運算 與大於 運算
db.emp.find({"job":"講師","salary":{$gt:8000}})
# in 運算
db.emp.find({"job":{$in:["講師","客服部"]}})
# or 運算
db.emp.find({$or:[{job:"講師" },{job:"客服部"}] })
排序與分頁:
// sort skip limit
db.emp.find().sort({dep:1,salary:-1}).skip(5).limit(2)
嵌套查詢:
# 錯誤示例:無結果
db.student.find({grade:{redis:87,dubbo:90 });
#錯誤示例:無結果
db.student.find({grade:{redis:87,dubbo:90,zookeper:85} })
# 基於複合屬性查找 時必須包含其所有的值 並且順序一至
db.student.find({grade:{redis:87,zookeper:85,dubbo:90} })
#基於複合屬性當中的指定值 查找。注:名稱必須用雙引號
db.student.find({"grade.redis":87});
db.student.find({"grade.redis":{"$gt":80}});
數組查詢:
db.subject.insertMany([
{_id:"001",name:"陳霸天",subjects:["redis","zookeper","dubbo"]},
{_id:"002",name:"張明明",subjects:["redis","Java","mySql"]},
{_id:"003",name:"肖炎炎",subjects:["mySql","zookeper","bootstrap"]},
{_id:"004",name:"李鬼才",subjects:["Java","dubbo","Java"]},
])
#無結果
db.subject.find({subjects:["redis","zookeper"]})
#無結果
db.subject.find({subjects:["zookeper","redis","dubbo"]})
# 與嵌套查詢一樣,必須是所有的值 並且順序一至
db.subject.find({subjects:["redis","zookeper","dubbo"]})
# $all 匹配數組中包含該兩項的值。注:順序不作要求
db.subject.find({subjects:{"$all": ["redis","zookeper"]}})
注:
# 簡化數組查詢
db.subject.find({subjects:"redis"})
# 簡化數組查詢 ,匹配數組中存在任意一值。與$all相對應
db.subject.find({subjects:{$in: ["redis","zookeper"]}})
數組嵌套查詢:
#基礎查詢 ,必須查詢全部,且順序一至
db.subject2.find({subjects:{name:"redis",hour:12} })
#指定查詢第一個數組 課時大於12
db.subject2.find({"subjects.0.hour":{$gt:12}})
#查詢任科目 課時大於12
db.subject2.find({"subjects.hour":{$gt:12}})
# $elemMatch 元素匹配,指定屬性滿足,且不要求順序一至
db.subject2.find({subjects:{$elemMatch:{name:"redis",hour:12}}})
# 數組中任意元素匹配 不限定在同一個對象當中
db.subject2.find({"subjects.name":"mysql","subjects.hour":120})
修改
#設置值
db.emp.update({_id:1101} ,{ $set:{salary:10300} })
#自增
db.emp.update({_id:1101} ,{ $inc:{salary:200}})
#基於條件 更新多條數據
# 只會更新第一條
db.emp.update({"dep":"客服部"},{$inc:{salary:100}})
# 更新所有 匹配的條件
db.emp.updateMany({"dep":"客服部"},{$inc:{salary:100}})
3、數據的修改與刪除
修改
#設置值
db.emp.update({_id:1101} ,{ $set:{salary:10300} })
#自增
db.emp.update({_id:1101} ,{ $inc:{salary:200}})
#基於條件 更新多條數據
# 只會更新第一條
db.emp.update({"dep":"客服部"},{$inc:{salary:100}})
# 更新所有 匹配的條件
db.emp.updateMany({"dep":"客服部"},{$inc:{salary:100}})
刪除:
// 基於查找刪除
db.emp.deleteOne({_id:1101})
// 刪除整個集合
db.project.drop()
// 刪除庫
db.dropDatabase()
4、全文索引
索引的創建
db.project.createIndex({name:"text",description:"text"})
基於索引分詞進行查詢
db.project.find({$text:{$search:"java jquery"}})
基於索引 短語
db.project.find({$text:{$search:"\"Apache ZooKeeper\""}})
過濾指定單詞
db.project.find({$text:{$search:"java apache -阿里"}})
查看執行計劃
db.project.find({$text:{$search:"java -阿里"}}).explain("executionStats")