使用數(shù)據(jù)庫:
use test
顯示當(dāng)前庫中的所有集合(相當(dāng)于關(guān)系型數(shù)據(jù)庫中的表):
show collections
或show dbs
顯示當(dāng)前庫中所有的集合名:
db.getCollectionNames()
-
開啟數(shù)據(jù)庫認證(linux系統(tǒng)在/etc/mongod.conf(mongodb3.x及以上版本)或/etc/mongodb.conf):
# mongod.conf(3.x及以上版本): security: authorization: enabled # mongdb.conf: auth=true
-
設(shè)置用戶:
use admin // 進入到admin庫中去設(shè)置 db.createUser( { user: "用戶名", pwd: "密碼", roles: [{role: ["角色列表"], db: "admin"}] } ) // 設(shè)置完畢后重啟mongoDB數(shù)據(jù)庫服務(wù) // 然后重新進入mongodb客戶端驗證是否用戶設(shè)置成功: use admin db.auth("用戶名", "密碼") // 或者執(zhí)行命令時直接指定 mongo --port 27017 -u "用戶名" -p "密碼" --authenticationDatabase "admin"
-
Ubuntu 16.x中對服務(wù)的操作
service [服務(wù)名] start # 啟動服務(wù)器 service [服務(wù)名] stop # 啟動服務(wù)器
-
查看服務(wù)的狀態(tài)
systemctl status [服務(wù)器]
-
添加(插入)
-
db.<collection>.insert()
向集合中插入一個或多個文檔
// 插入一個文檔 db.stus.insert({name: "豬八戒", age: 28, gender: "男"}); // 插入多個 db.stus.insert([ {name: "沙和尚", age: 38, gender: "男"}, {name: "白骨精", age: 16, gender: "女"} ]); // 默認_id屬性表示數(shù)據(jù)唯一性 _id: ObjectId("5e97359053f77289926c54e4"); // 如果自己手動添加了_id牺弄,則數(shù)據(jù)庫就不會自動生成時間戳Id屬性了(數(shù)據(jù)必須唯一,所以建議還是使用數(shù)據(jù)庫自帶的)
db.<collection>.insertOne()
向集合中插入一個文檔
在version3.2
中新加的db.<collection>.insertMany()
想集合中插入多個文檔
在version3.2
中新加的
-
-
查詢
-
db.<collection>.find()
如果不傳入?yún)?shù)宜狐,則直接查詢所有數(shù)據(jù)
// 查詢stus集合中的所有數(shù)據(jù)(返回一個數(shù)組) db.stus.find(); // 同上势告,查詢集合中所有數(shù)據(jù)(返回一個數(shù)組) db.stus.find({}); // 查找_id值為“hello”的文檔(符合條件的均會查找出來,返回數(shù)組) db.stus.find({_id: "hello"}); // 查找符合age是16且name為"hello"的文檔(AND, 返回數(shù)組) db.stus.find(age: 16, name: "hello"); // 查詢集合中符合條件的第一條記錄(只返回一個對象) db.stus.findOne({name: "hello"}); // 如果要通過內(nèi)嵌文檔對文檔進行查詢,此時需要屬性名使用引號(單引號抚恒、雙引號都可) db.users.find({"hobby.movies": "hero"}); // 統(tǒng)計文檔的數(shù)量(符合條件的數(shù)據(jù)數(shù)據(jù)量) == 更常用 db.stus.find({}).count(); // 同上, 一般情況下數(shù)量相同 db.stus.find({}).length(); // 設(shè)置顯示數(shù)據(jù)的上限(即獲取多少條數(shù)據(jù)), skip與limit方法順序沒有限定 db.numbers.find().skip(`要跳過的條目數(shù)`).limit(`獲取多少數(shù)據(jù)`); // 排序(大于0升序咱台,小于0降序) // 多個排序規(guī)則逗號分隔,類似sql語句中的order by db.numbers.find().sort({`要排序的字段`: `大于0的值或小于0的值`,`要排序的字段`: `大于0的值或小于0的值`, ...}); // limit俭驮、skip回溺、sort可以任意順序調(diào)用: 數(shù)據(jù)庫的執(zhí)行順序都是: sort、skip混萝、limit // 在查詢時可以在第二個參數(shù)的位置設(shè)置查詢結(jié)果的投影(類似sql里邊的查詢字段) db.emp.find({}, {ename: 1, _id: 0, ...}) // 可以給查詢結(jié)果給出要顯示的字段: 1顯示真朗,0不顯示
查詢操作符:
$eq 等于 $gt 大于 $gte 大于等于 $in 包含少漆,相當(dāng)于sql中的in $lt 小于 $lte 小于等于 $ne 不等于 $nin 不包含轮洋,相當(dāng)于sql中的not in
-
-
更新
-
db.<collection>.update(
查詢條件
碰纬,新對象
)// 更新前一般先查詢, 默認情況下會用新對象替換舊對象 // 默認情況下只會修改一個, 第三個參數(shù)可選 db.stus.update({name: "沙和尚"}, {age: 28}, { upsert: <boolean值>, multi: <boolean值>, // 默認不修改多個 writeConcern: <document: 即對象>, collation: <document: 即對象> }); // 如果修改指定的屬性,而不是替換崭倘,則需要使用修改操作符 // 語法: operation: {....} db.stus.update({_id: ObjectId(9fd43243258923dcdf)}, {$set: {name: "沙和尚"}}); // 刪除文檔的指定屬性 db.stus.update({_id: ObjectId(xxxx)}, {$unset: {name: "因為是刪除屬性翼岁,所以什么值都行"}}); // 同時修改多個符合條件的文檔 db.stus.updateMany({_id: ObjectId(473892478923784923)}, {$set: {address: "高辣莊"}}); // 向數(shù)據(jù)庫中的數(shù)組屬性追加數(shù)據(jù) db.stus.update({_id: ObjectId(473892478923784923)}, {$push: {address: "高辣莊"}}); // 向數(shù)據(jù)庫中的數(shù)組屬性追加數(shù)據(jù)(數(shù)據(jù)重復(fù)不追加) db.stus.update({_id: ObjectId(473892478923784923)}, {$addToSet: {address: "高辣莊"}}); // 只更改單個數(shù)據(jù) db.stus.updateOne({name: "沙和尚"}, {age: 28}); // 替換文檔 db.stus.replaceOne({name: "沙和尚"}, {age: 28});
-
-
刪除
- db.<collection>.remove({
刪除條件
}, {可選參數(shù)
});
// 刪除符合條件的數(shù)據(jù)(數(shù)據(jù)有多個則一起刪除) db.stus.remove({_id: "hello"}); // 刪除符合條件的一個數(shù)據(jù)(如果有多個,則只刪除第一個) db.stus.remove({_id: "hello"}, { justOne: <boolean值>, writeConcern: <document: 即對象> }); // 刪除所有(傳空時表示全部刪除, 性能較差) db.stus.remove({}); // 所有要刪除直接移除集合即可(如何集合全部沒有后司光,數(shù)據(jù)庫也隨之刪除) db.stus.drop(); // 刪除數(shù)據(jù)庫 db.dropDatabase(); // 刪除一條數(shù)據(jù) db.stus.deleteOne({_id: "hello"}); // 刪除多條數(shù)據(jù) db.stus.deleteMany({_id: "hello"});
- db.<collection>.remove({
-
Mongoose
安裝依賴: yarn i mongoose --save 或者 npm i mongoose --save
// 引入Mongoose依賴 const mongoose = require('mongoose'); // 連接mongoDB數(shù)據(jù)庫 // 連接格式: mongodb://[username:password]@127.0.0.1/databaseName?authSource=[用戶保存的數(shù)據(jù)庫名] mongoose.connect('mongodb://localhost/test', {useNewUrlParser: true, useUnifiedTopology: true}); // 連接成功后回調(diào) mongoose.connection.once("open", () => { console.log("MongoDB數(shù)據(jù)庫鏈接成功!") }); // 斷開連接前回調(diào) mongoose.connection.once("close", () => { console.log("MongoDB數(shù)據(jù)庫斷開連接!"); }); /** * MongoDB一般情況只需要連接一次就可琅坡,除非項目停止, * 服務(wù)器關(guān)閉残家,否則連接一般不會斷開榆俺。 * (關(guān)系型數(shù)據(jù)庫需要操作事務(wù),所以每次操作完畢都需要進行一次斷開連接跪削,但是MongoDB是菲關(guān)系型數(shù)據(jù)庫 * 沒有事務(wù)控制谴仙,所以不需要考慮事務(wù)問題。) */ // mongoose.disconnect(); /** * mongoose 提供了三個核心對象 * 1. Schema 建立檔案時的約束 * 2. Model -> 對應(yīng)Collection (相當(dāng)于關(guān)系型數(shù)據(jù)庫中的表) * 3. Document -> 對應(yīng)記錄 (相當(dāng)于關(guān)系型數(shù)據(jù)的每行的記錄數(shù)據(jù)) */ let Schema = mongoose.Schema; // 創(chuàng)建表的約束 let testSchema = new Schema({ name: String, addr: String, create_time: { type: Date, default: Date.now } }); // 創(chuàng)建Model: 因為對應(yīng)的是集合碾盐,所以最好使用大寫命名 // mongoose 會動將集合名變成為復(fù)數(shù) let TestModel = mongoose.model("test", testSchema); /** * 相關(guān)Model: * 用于創(chuàng)建文檔(一個或多個,即一個對象或?qū)ο髷?shù)組)揩局,并添加到集合中 * 1.Model.create(doc(s), (err) => {}) // callback: 完成操作后的回調(diào)函數(shù) * 回調(diào)函數(shù)有兩個參數(shù): 1: err -> 錯誤對象 2: 插入成功的數(shù)據(jù) * 2. Model.findById("ID值字符串" , ..., (err, doc) => {查詢的數(shù)據(jù), doc為document對象, 是Model的一個實例} ) 通過主鍵ID查詢, 回調(diào)函數(shù)中返回的Document對象 * 3. Model.findOne() 只查詢一個數(shù)據(jù) * 4. Model.find({查詢條件對象},”字段投影, 多個字段空格隔開毫玖,如果不需要則在前面加個一個減號:-“ | {可以使用傳統(tǒng)的投影方式,即需要顯示字段為key,值取1為顯示付枫,0不顯示},{skip: 10 [跳過多少條數(shù)據(jù)] , limit: 2 [取幾條數(shù)據(jù)], sort: 1 [排序升序]} , (err, doc) =>{返回的數(shù)據(jù), doc為document對象烹玉,是Model的一個實例}) 查詢數(shù)據(jù)(返回數(shù)組) * 5. Model.update({查詢條件}, {修改修飾符: {要修改的數(shù)據(jù)}}, {multi(多數(shù)據(jù)影響): true}[可選參數(shù)] , (err) = > {回調(diào)函數(shù)}) 符合條件的都更新 * 6. MOdel.updateOne() 更新一個 * 7. Model.remove({刪除條件}, (err)=>{回調(diào)函數(shù)}); * 7. Model.deleteOne({刪除條件}, (err)=>{回調(diào)函數(shù)}); * 7. Model.deleteMany({刪除條件}, (err)=>{回調(diào)函數(shù)}); * 8. Model.count({要統(tǒng)計的數(shù)據(jù)條件}, (err, data) => {回調(diào)函數(shù),data為統(tǒng)計的結(jié)果}); */ /** * Document相關(guān) * 1. new Model({ * 對象數(shù)據(jù) * }); -> 創(chuàng)建一個Document對象 * 2. Document實例.save() -> 保存數(shù)據(jù) * 3. Document實例.update({修改的數(shù)據(jù)}, (err, data) => { * //... * }) -> 保存數(shù)據(jù) * 4. doc.[字段名] = 值; doc.save() -> 也可以保存數(shù)據(jù) * 6. doc.get(字段名名) -> 獲取文檔的對應(yīng)屬性值 doc.屬性值 -> 也可以獲取對應(yīng)屬性值 * 7. doc.set(Key,Value) -> 修改文檔對應(yīng)屬性的值, 但沒有調(diào)用save之前不會保存到數(shù)據(jù)庫中 * 8. doc._id 或 doc.id -> 獲取主鍵值 **9. doc.toJSON() 轉(zhuǎn)換為JSON對象 * 10.doc.toObject() 將document對象轉(zhuǎn)成普通的js對象 * 11. doc對象無法使用delete */ // 插入一條新數(shù)據(jù) TestModel.create({ name: "孫悟空", addr: "花果山水簾洞" }, (err) => { if(!err){ console.log("新增成功!"); } }); // 統(tǒng)計數(shù)據(jù)結(jié)果 TestModel.count({}, (err, data) => { console.log(data); }); // 插入多條數(shù)據(jù) TestModel.create([ { name: "豬八戒", addr: "摩云洞" }, { name: "唐僧", addr: "東土大唐" } ], (err) => { if(!err){ console.log("新增成功!"); } });
命名規(guī)范:
- 集合是多個,所有一般使用單詞復(fù)數(shù)來命名