柚子快報邀請碼778899分享:mongodb數(shù)據(jù)庫使用
柚子快報邀請碼778899分享:mongodb數(shù)據(jù)庫使用
一、下載安裝
不同版本的下載安裝方式不同,大家根據(jù)所需版本百度安裝
官網(wǎng)MongoDB: The Developer Data Platform | MongoDB
二、基本概念
1、什么是mongo
一種數(shù)據(jù)庫,而且是非關系型數(shù)據(jù)庫??梢钥焖匍_發(fā)web型應用,因為靈活,不用像關系型數(shù)據(jù)庫一樣需要建表,MongoDB存儲的是文檔(document),文檔內(nèi)存儲的是類似json的結(jié)構
2、mongo中的幾個概念
數(shù)據(jù)庫 database 集合(數(shù)組) collection
類似與SQL中的數(shù)據(jù)表,本質(zhì)上是一個數(shù)組,里面包含看多個文檔對象,[{},{},{}] 文檔對象 document
類似與SQL中的記錄,一個文檔對象{}就是一條記錄 一個數(shù)據(jù)庫由多個集合構成,一個集合包含多個文檔對象。
3、基本使用
show dbs 或show databases
查看所有的數(shù)據(jù)庫use xxx
切換到指定的數(shù)據(jù)庫db
查看當前操作的數(shù)據(jù)庫show collections
查看當前數(shù)據(jù)庫中所有的集合
MongoDB關系: 數(shù)據(jù)庫(database) > 集合(collection)> 文檔(document)
值得注意的是: 在MongoDB中不需要自己創(chuàng)建數(shù)據(jù)庫和集合,便可以直接創(chuàng)建文檔,其實就是在創(chuàng)建文檔的同時,會將數(shù)據(jù)庫和集合創(chuàng)建了。
4、mongodbmanagerfree
mongodb?可視化工具下載路徑
Download NoSQL Manager for MongoDB Freeware
三、?數(shù)據(jù)庫的CRUD操作
具體內(nèi)容查看官方文檔: https://mongoosejs.com/
核心: 增: insert() 刪: remove() 查: find() 改: update()
1、增加
db.collection.insert()
向集合中插入一個或多個文檔,當我們向集合中插入文檔時,如果沒有給文檔指定_id屬性,則數(shù)據(jù)庫會自動給文檔添加_id,該屬性用來作為文檔的唯一標識,_id可以自己指定,如果我們指定了,數(shù)據(jù)庫就不會再添加了,如果自己指定_id必須也確保唯一性 db.collection.insertOne():插入一個文檔對象 db.collection.insertMany():插入多個文檔對象
db.piyou.insert({name: "孫悟空", age: 28, address:"花果山"});
/*
表示向 集合名為piyou插入了文檔, 文檔內(nèi)容是對象。
集合名是自己創(chuàng)建的,想用什么名稱就用什么。
*/
db.piyou.insert([
{name:"豬八戒", age: 38, address:"高老莊"},
{name: "沙和尚", age: 45, address:"流沙河"}
]);
/*
可以注意到: 傳遞的數(shù)據(jù)是數(shù)組,數(shù)組內(nèi)部是對象,
其實對象就相當于文檔,這就是插入了兩個文檔。
*/
#添加兩萬條數(shù)據(jù)
for(var i=0;i<20000;i++){
db.users.insert({username:'liu'+i}) #需要執(zhí)行20000次數(shù)據(jù)庫的添加操作
}
db.users.find().count()//20000
#優(yōu)化:
var arr=[];
for(var i=0;i<20000;i++){
arr.push({username:'liu'+i})
}
db.user.insert(arr) #只需執(zhí)行1次數(shù)據(jù)庫的添加操作,可以節(jié)約很多時間
$push:用于向數(shù)組中添加一個新的元素
db.user.update({username:"tangseng"},{$push:{"hobby.movies":"Interstellar"}})
$addToSet:向數(shù)組中添加一個新元素(類似于向set集合中添加,如果數(shù)組中已經(jīng)存在了該元素,則添加失敗,因為不可重復)
db.user.update({username:"tangseng"},{$addToSet:{"hobby.movies":"Interstellar"}})
2、查詢
db.collection.find()
db.collectionName.find() 或db.collectionName.find({})
查詢集合所有的文檔,即所有的數(shù)據(jù)。查詢到的是整個數(shù)組對象。在最外層是有一個對象包裹起來的。db.collectionName.count()或db.collectionName.length() 統(tǒng)計文檔個數(shù) db.collectionName.find({_id:222})
條件查詢。注意:結(jié)果返回的是一個數(shù)組 db.collectionName.findOne() 返回的是查詢到的對象數(shù)組中的第一個對象
注意
> db.students.find({_id:222}).name //錯誤
> db.students.findOne({_id:222}).name //正確
?
# 1.mongodb支持直接通過內(nèi)嵌文檔的屬性值進行查詢
# 什么是內(nèi)嵌文檔:hobby就屬于內(nèi)嵌文檔
{
name:'liu',
hobby:{
movies:['movie1','movie2'],
cities:['zhuhai','chengdu']
}
}
db.users.find({hobby.movies:'movie1'}) //錯誤
db.users.find({"hobby.movies":'movie1'})//此時查詢的屬性名必須加上引號
#2.查詢操作符的使用
#比較操作符
$gt 大于
$gte 大于等于
$lt 小于
$lte 小于等于
$ne 不等于
$eq 等于的另一種寫法
db.users.find({num:{$gt:200}}) #大于200
db.users.find({num:{$gt:200,$lt:300}}) #大于200小于300
$or 或者
db.users.find(
{
$or:[
{num:{$gt:300}},
{num:{$lt:200}}
]
}
) #大于300或小于200
#3.分頁查詢
db.users.find().skip(頁碼-1 * 每頁顯示的條數(shù)).limit(每頁顯示的條數(shù))
db.users.find().limit(10) #前10條數(shù)據(jù)
db.users.find().skip(50).limit(10) #跳過前50條數(shù)據(jù),即查詢的是第61-70條數(shù)據(jù),即第6頁的數(shù)據(jù)
#4.排序
db.emp.find().sort({sal:1}) #1表示升序排列,-1表示降序排列
db.emp.find().sort({sal:1,empno:-1}) #先按照sal升序排列,如果遇到相同的sal,則按empno降序排列
#注意:skip,limit,sort可以以任意的順序調(diào)用,最終的結(jié)果都是先調(diào)sort,再調(diào)skip,最后調(diào)limit
#5.設置查詢結(jié)果的投影,即只過濾出自己想要的字段
db.emp.find({},{ename:1,_id:0}) #在匹配到的文檔中只顯示ename字段
3、修改
# 1.替換整個文檔
# db.collectionName.update(condiction,newDocument)
> db.students.update({_id:'222'},{name:'kang'})
# 2.修改對應的屬性,需要用到修改操作符,比如$set,$unset,$push,$addToSet
db.collectionName.update(
# 查詢條件
{_id:222},
{
#修改對應的屬性
$set:{
name:'kang2',
age:21
}
#刪除對應的屬性
$unset:{
gender:1 //這里的1可以隨便改為其他的值,無影響
}
}
)
# 3.update默認與updateOne()等效,即對于匹配到的文檔只更改其中的第一個
# updateMany()可以用來更改匹配到的所有文檔
db.students.updateMany(
{name:'liu'},
{
$set:{
age:21,
gender:222
}
}
)
# 4.向數(shù)組中添加數(shù)據(jù)
db.users.update({username:'liu'},{$push:{"hobby.movies":'movie4'}})
#如果數(shù)據(jù)已經(jīng)存在,則不會添加
db.users.update({username:'liu'},{$addToSet:{"hobby.movies":'movie4'}})
# 5.自增自減操作符$inc
{$inc:{num:100}} #讓num自增100
{$inc:{num:-100}} #讓num自減100
db.emp.updateMany({sal:{$lt:1000}},{$inc:{sal:400}}) #給工資低于1000的員工增加400的工資
4、刪除
# 1. db.collectionName.remove()
# remove默認會刪除所有匹配的文檔。相當于deleteMany()
# remove可以加第二個參數(shù),表示只刪除匹配到的第一個文檔。此時相當于deleteOne()
db.students.remove({name:'liu',true})
# 2. db.collectionName.deleteOne()
# 3. db.collectionName.deleteMany()
db.students.deleteOne({name:'liu'})
# 4. 刪除所有數(shù)據(jù):db.students.remove({})----性格較差,內(nèi)部是在一條一條的刪除文檔。
# 可直接通過db.students.drop()刪除整個集合來提高效率。
# 5.刪除集合
db.collection.drop()
# 6.刪除數(shù)據(jù)庫
db.dropDatabase()
# 7.注意:刪除某一個文檔的屬性,應該用update。 remove以及delete系列刪除的是整個文檔
# 8.當刪除的條件為內(nèi)嵌的屬性時:
db.users.remove({"hobby.movies":'movie3'})
四、文檔之間的關系
1、一對一(one to one)
在MongoDB中,可以通過內(nèi)嵌文檔的形式來體現(xiàn)出一對一的關系
db.WifeAndHusband.insert([
{
wife:"黃蓉",
husband:{
name:"郭靖"
}
},
{
wife:"潘金蓮",
husband:{
name:"武大郎"
}
}
])
2、一對多(one to many)/ 多對一(many to one)
一對多:父母和孩子、用戶和訂單、文章和評論,也可以通過內(nèi)嵌文檔的方式來映射一對多的關系(將1的那個屬性設置為多的里面的字段)
db.order.insert({
list:["watermelor"],
user_id:ObjectId("5f87b1deda684b252c2fc7a5")
})
var user_id = db.users.findOne({username:"swk"})._id
//查詢孫悟空的訂單
db.order.find({user_id:user_id})
3、多對多(many to many):分類和商品,通過內(nèi)嵌文檔的方式
db.teacher.insert([
{name:"洪七公"},
{name:"黃藥師"},
{name:"龜仙人"}
])
db.stus.insert([
{
name:"郭靖",
tech_ids:[
ObjectId("5f87b4b6da684b252c2fc7a8"),
ObjectId("5f87b4b6da684b252c2fc7a9")
]
},
{
name:"孫悟空",
tech_ids:[
ObjectId("5f87b4b6da684b252c2fc7a8"),
ObjectId("5f87b4b6da684b252c2fc7a9"),
ObjectId("5f87b4b6da684b252c2fc7aa")
]
}
])
練習
//查詢工資小于1000或者大于2000的員工
db.emp.find( $or:[ {sal:{$lt:1000}},{sal:{$gt:2500}} ])
//為所有工資小于1000的增加400
db.emp.find({sal:{$lte:1000}}, {$inc:{$sal:400}})
五、mongoose
1、什么是mongoose
一般我們不會直接用MongoDB的函數(shù)來操作MongoDB數(shù)據(jù)庫 , 而Mongose就是一套操作MongoDB數(shù)據(jù)庫的接口。 簡而言之就是:mongoose也可以操作mongodb數(shù)據(jù)庫,而且它來操作數(shù)據(jù)庫會有更多好處
2、mongoose中的對象:
Schema 模式對象(用于約束文檔的結(jié)構)Model 模型對象(即mongodb中的集合)Document 文檔對象(即mongodb中的文檔)
3、安裝
npm i -s mongoose
4、連接數(shù)據(jù)庫
// 1.引入mongoose
const mongooes = require("mongoose");
// 2.連接mongodb數(shù)據(jù)庫
mongooes.connect("mongodb://localhost/users", {
useNewUrlParser: true,
useUnifiedTopology: true,
});
// 3.監(jiān)聽mongodb數(shù)據(jù)庫的連接狀態(tài)
// 綁定數(shù)據(jù)庫連接成功事件
mongooes.connection.once("open", function () {
console.log("連接成功");
});
// 綁定數(shù)據(jù)庫連接失敗事件
mongooes.connection.once("close", function () {
console.log("數(shù)據(jù)庫連接已經(jīng)斷開");
});
// 4.斷開數(shù)據(jù)庫連接(一般不用)
mongooes.disconnect();
?5、創(chuàng)建模式對象和模型對象
const Schema=mongooes.schema;
//創(chuàng)建模式對象
const stuSchema=new Schema({
name:String,
age:Number,
gender:{
type:String,
default:'female'
},
address:String
})
//創(chuàng)建模型對象
const StuModel=stuSchema.model("student",stuSchema); //第一個參數(shù)表示創(chuàng)建的集合的名稱,第二個參數(shù)表示利用的模式對象
6、利用模型對象進行增刪查改操作
添加
UserModel.create({ user_id: 100, name: "liu1" }, function (err) {
if (!err) {
console.log("插入成功");
} else {
console.log(err);
}
});
let data = [
{ user_id: 101, name: "liu2", age: 22 },
{ user_id: 102, name: "liu3" },
];
UserModel.create(data, function (err) {
console.log(arguments[1]); //第二個值表示的是所添加的文檔對象,是一個數(shù)組
});
查詢
/*
查詢:
model.find(conditions,[projection],[options],callback)
conditions:查詢的條件
projection:投影 { name: 1, gender: 1, _id: 0 } 或 'name gender -_id'
options:查詢選項 { skip: xx, limit: xx }
model.findOne(...)
model.findById(...)
model.countDocuments(conditions,callback) 查詢文檔的數(shù)量
*/
UserModel.find({}, function (err, data) {
console.log(data);
});
UserModel.find(
{ name: /liu/i },
"name gender -_id",
{ skip: 2, limit: 1 },
function (err, data) {
console.log(data); //返回的是一個文檔對象數(shù)組
}
);
UserModel.findById("5f9fbfba14319e492c0f5bc4", function (err, data) {
console.log(data);
console.log(data instanceof UserModel); //true 返回的文檔對象屬于模型對象(即集合)的實例對象
});
UserModel.countDocuments({}, function (err, data) {
console.log(data);
});
刪除
/*
刪除:
model.remove(conditions,callback)
model.deleteOne(...)
model.deleteMany(...)
*/
UserModel.remove(
{
name: "liu2",
},
function (err, data) {
console.log("刪除成功");
}
);
UserModel.find({}, function (err, data) {
console.log(data);
});
修改
/* 修改:
model.update(conditions,[doc],[options],callback)
doc:修改后的文檔對象
model.updateMany(...)
model.uodateOne(...)
*/
UserModel.updateOne({ name: "liu1" }, { $set: { age: 22 } }, function (
err,
data
) {
if (!err) {
console.log("修改成功");
}
});
UserModel.find({ name: "liu1" }, function (err, data) {
console.log(data);
});
7、模塊化處理
單獨創(chuàng)建一個數(shù)據(jù)庫連接文件dbconncet.js
const mongooes = require("mongoose");
mongooes.connect("mongodb://localhost/mongooes_test", {
useNewUrlParser: true,
useUnifiedTopology: true,
});
mongooes.connection.once("open", function () {
console.log("連接成功");
});
為每一個集合創(chuàng)建一個模型對象文件xxxModel.js
const mongooes = require("mongoose");
const Schema = mongooes.Schema;
const userSchema = new Schema({
user_id: String,
name: String,
age: Number,
gender: {
type: Number,
default: 0,
},
});
const UserModel = mongooes.model("user", userSchema);
module.exports = UserModel;
在最終的文件index.js中引入數(shù)據(jù)庫連接文件和創(chuàng)建模型的文件
const mongooes = require("./dbconncet");
const PostModel = require("./models/postModel");
PostModel.findOne({}, function (err, data) {
if (!err) {
console.log(data);
}
});
柚子快報邀請碼778899分享:mongodb數(shù)據(jù)庫使用
相關閱讀
本文內(nèi)容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權,聯(lián)系刪除。