通過node安裝mongoose模塊,進(jìn)行mongodb的一些基本語法操作。
一、啟動mongodb
在命令行中輸入net start mongoDB
二舟扎、安裝mongoose
npm install mongoose
三、新建demo.js悴务,輸入下列代碼
// 引入mongoose
const mongoose = require('mongoose')
// 連接mongodb數(shù)據(jù)庫
mongoose.connect('mongodb://localhost/demoDatabase')
.then(res=>{
console.log('連接成功')
}).catch(err=>{
console.log('連接失敗')
})
上面代碼完成后悔出現(xiàn)一個警告
(node:11972) DeprecationWarning: current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.
上列代碼加入一個對象{ useUnifiedTopology: true }
// 引入mongoose
const mongoose = require('mongoose')
// 連接mongodb數(shù)據(jù)庫
mongoose.connect('mongodb://localhost/demoDatabase',{ useUnifiedTopology: true })
.then(res=>{
console.log('連接成功')
}).catch(err=>{
console.log('連接失敗')
})
四睹限、創(chuàng)建集合規(guī)則
const Course = new mongoose.Schema({
name:String,
author:String,
sex:String
})
五、插入文檔
第一種插入文檔方式:
const course = new Course({
name:'html',
author:'張三',
sex:'男'
})
course.save()
第二種插入文檔方式通過回調(diào)函數(shù)獲取異步api的返回值:
Course.create({ name:'html',author:'張三',sex:'男'},(err,result)=>{
// 如果err返回為null 說明插入文檔成功
if(err !== null){
return console.log('失斞堕堋:',err);
}
console.log('成功:',result)
})
第三種方式使用promise異步接收返回值:
Course.create({ name:'html',author:'張三',sex:'男'})
.then(result => {
console.log('成功:',result);
}).catch(err => {
console.log('失斚哿啤:',err);
})
六、mongoDB數(shù)據(jù)庫導(dǎo)入數(shù)據(jù)
首先在官網(wǎng)下載MongoDB Database Tools别洪,下載完成后解壓出來叨恨,將壓縮包里面bin里的exe文件,全部復(fù)制到mongoDB安裝目錄挖垛,我的是C:\Program Files\MongoDB\Server\4.4\bin
痒钝,然后配置系統(tǒng)環(huán)境變量,依次點開此電腦——屬性——高級系統(tǒng)設(shè)置——環(huán)境變量——在系統(tǒng)變量中找到Path雙擊——新建——將路徑復(fù)制進(jìn)去——確定
導(dǎo)入命令:
mongoimport -d 數(shù)據(jù)庫名稱 -c 集合名稱 --file 要導(dǎo)入的數(shù)據(jù)文件
例:
mongoimport -d playground -c users --file .\user.json
七痢毒、查詢文檔
// 新建集合規(guī)則 userSchema
const userSchema = new mongoose.Schema({
name: String,
age: Number,
emial: String,
password: String,
hobbies: [String]
})
// 使用規(guī)則創(chuàng)建集合
const User= mongoose.model('User', userSchema);
1.0送矩、find()方法查詢用戶集合中的所有文檔
User.find().then(result => console.log(result));
1.1、find()方法查詢指定_id查詢文檔數(shù)據(jù)
User.find({ _id: '5c09f267aeb04b22f8460968' }).then(result => console.log(result));
注意:通過find()方法查詢出來的數(shù)據(jù)哪替,不管是多少條返回的都是數(shù)組
1.2栋荸、findOne()方法返回一條文檔數(shù)據(jù),默認(rèn)返回當(dāng)前集合中的第一條文檔,返回一個對象
User.findOne().then(result => console.log(result));
1.3晌块、findOne()通過指定name查詢文檔數(shù)據(jù)爱沟,返回一個對象
User.findOne({ name: '張三' }).then(result => console.log(result));
1.4、匹配查詢 大于 小于匆背,查詢年齡大于10小于20以內(nèi)的文檔數(shù)據(jù)呼伸,lt:小于
User.find({ age: { $gt: 10, $lt: 20 } }).then(result => console.log(result));
1.5钝尸、匹配包含蜂大,查詢愛好中包含'打豆豆'的文檔數(shù)據(jù)
User.find({ hobbies: { $in: ['打豆豆'] } }).then(result => console.log(result));
1.6、模糊查詢name中含有'王'的文檔數(shù)據(jù)
User.find({ name: { $regex: '王', $options: 'i' } }).then(result => console.log(result));
1.7蝶怔、選擇要查詢的字段并且不查詢_id
的文檔數(shù)據(jù)
User.find().select('name age -_id').then(result => console.log(result));
1.8、將年齡按照升序進(jìn)行排序兄墅,降序則修改為-age
User.find().sort('age').then(result => console.log(result));
1.9踢星、查詢跳過一條并且限制3條的文檔數(shù)據(jù),skip跳過多少條數(shù)據(jù) limit限制查詢數(shù)量
User.find().skip(1).limit(3).then(result => console.log(result));
八隙咸、刪除文檔
1.0沐悦、刪除指定_id的文檔數(shù)據(jù),成功則返回被刪除的對象五督,沒找到則返回null藏否,刪除單個文檔數(shù)據(jù)
User.findOneAndDelete({ _id: '5c09f267aeb04b22f8460968' }).then(result => console.log(result));
1.1、刪除多個文檔數(shù)據(jù)充包,將數(shù)據(jù)庫中的文檔全部刪除副签,返回ok為1則代表刪除成功
User.deleteMany({}).then(result => console.log(result));
九、更新文檔
1.0基矮、更新指定name的文檔數(shù)據(jù)淆储,王二麻子
更新為王麻子
返回ok為1則代表更新成功,(更新一個)
User.updateOne({ name: '王二麻子' }, { name: '王麻子' }).then(result => console.log(result));
1.1家浇、更新文檔中所有數(shù)據(jù)本砰,將全部文檔password更新為123,(更新多個)
User.updateMany({}, { password: '123' }).then(result => console.log(result));
十磁椒、mongoDB驗證
// 新建集合規(guī)則 userSchema
const userSchema = new mongoose.Schema({
// 標(biāo)題
title: {
// 類型
type: String,
// 必填項
required: [true, '標(biāo)題不能為空'],
// 最小長度
minlength: [3, '最小長度不能低于3'], //字符串長度
// 最大長度
maxlength: [15, '最大長度不能高于15'], //字符串長度
// 去除兩端空格
trim: true
},
// 年齡
age: {
type: Number,
// 最小值
min: [18, '最小數(shù)組不能低于18'],
// 最大值
max: [100, '最大數(shù)組不能高于100']
},
// 日期
dateTime: {
type: Date,
// 默認(rèn)值
default: Date.now
},
// 分類
category: {
type: String,
// 指定分類傳入html务傲、css坷随、javascript、vue还棱,傳入其他則報錯
// enum: ['html', 'css', 'javascript', 'vue']
enum: {
values: ['html', 'css', 'javascript', 'vue'],
message: '當(dāng)前沒有找到該分類標(biāo)簽'
}
},
// 作者
author: {
type: String,
// 自定義驗證
validate: {
validator: v => {
// v 要驗證的值
// 當(dāng)前函數(shù)返回布爾值,true驗證成功惭等,false驗證失敗
return v && v.length > 4
},
message: '傳入的值不能為空并且不能小于4'
},
}
})
// 使用規(guī)則創(chuàng)建集合
const User= mongoose.model('User', userSchema);
十一诱贿、集合關(guān)聯(lián)
// 使用規(guī)則創(chuàng)建集合
const User = mongoose.model('User', new mongoose.Schema({
name: {
type:String,
unique:true // 表示唯一鍵
},
age: Number,
emial: String,
password: String,
hobbies: [String]
}));
// 使用規(guī)則創(chuàng)建集合
const Course = mongoose.model('Course', new mongoose.Schema({
title: String,
author: {
// 使用id將當(dāng)前集合和用戶集合關(guān)聯(lián)
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
},
isPublished: Boolean
}));
// 創(chuàng)建課程
Course.create({ title: 'java', author: '5c09f294aeb04b22f8460969' }).then(result => console.log(result));
// 使用populate方法進(jìn)行關(guān)聯(lián)集合查詢
// 查詢Course集合中所有關(guān)聯(lián)author信息的文檔數(shù)據(jù)
Course.find().populate('author').then(result => {
// 循環(huán)查詢出來的文檔數(shù)據(jù)
for (let item of result) {
console.log(item);
}
})