安装mongoose
npm install mongoose
开启数据库
mongod
可视化工具
// 可以通过可视化工具配合操作
// 工具名:MongoDB Compass Community
[工具链接](https://docs.mongodb.com/compass/current/install/)
连接数据库
const mongoose = require('mongoose');
mongoose.set('useCreateIndex', true);
// mongoose.set('debug', true);
const DB_NAME = 'demo';
const DB_URL = 'localhost:27017';
let dbPromise = new Promise((resolve, reject) => {
// 使用模版字符串,防止在操作过程中出现错误
// 数据库是demo
mongoose.connect(`mongodb://${DB_URL}/${DB_NAME}`, {useNewUrlParser: true})
// 监听链接状态
mongoose.connection.on('open', (err) => {
if (err) {
console.log(`位于${DB_URL}上的${DB_NAME}数据库连接失败`);
reject(err)
} else {
console.log(`位于${DB_URL}上的${DB_NAME}数据库连接成功`);
resolve()
}
})
});
如果Terminal 报(node:8278) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.
这个警告,可以在引入mongoose
之后使用mongoose.set('useCreateIndex', true)
mongoose.set('debug', true)
开启debug,可以在Terminal跟踪状态日志
定义模式
;(async () => {
await dbPromise;
var Schema = mongoose.Schema;
var blogSchema = new Schema({
title: {
type: String,
required: true, // 必须有
unique: true // 唯一性
},
author: String,
body: String,
comments: [{body: String, data: Date}],
date: {type: Date, default: Date.now},
hidden: Boolean,
gender: {
type: Number,
enum: [0, 1], // 枚举 代表此值只能是枚举里的任一值
default: 0
},
meta: {
votes: Number,
favs: Number
},
hobbies: [String],
info: {
type: Schema.Types.Mixed // 接收所有类型
},
enable_flag: {
type: String,
default: 'Y'
}
});
// 集合是Blog 在mongodb里默认变成复数
const Blog = mongoose.model('Blog', blogSchema);
// 增删改查操作写在这里
--->> 操作
})();
增加数据
/**
* 增加数据
*/
const blog = new Blog({
title: '测试22',
author: '张三1',
hidden: false
});
// 若保存成功,则返回当前要保存数据的对象
blog.save((err, ret) => {
if (err) {
console.log('保存失败')
} else {
console.log('保存成功');
console.log(ret)
}
});
查询数据
/**
* 查询数据
*/
// 查询所有 返回是一个数组 如果集合为空,则返回一个空数组
Blog.find((err, ret) => {
if (err) {
console.log('查询失败')
} else {
console.log('查询成功');
console.log(ret)
}
});
// 按条件查询 返回的是数组 若无匹配项,则返回空数组
Blog.find({
$or: [
{
author: '张三1'
}, {
title: '测试1'
}
]
}, {title: 1}, (err, ret) => { // 中间对象时可选参数,里面字段时在Schema定义的字段名,0代表不返回该字段,1代表返回该字段
if (err) {
console.log('查询失败')
} else {
console.log('查询成功');
console.log(ret)
}
});
// 按条件查询 返回的是对象,且仅有一个对象 若无匹配项,则返回null
Blog.findOne({
title: '测试1'
}, {author: 1, _id: 0}, (err, ret) => {
if (err) {
console.log('查询失败')
} else {
console.log('查询成功');
console.log(ret)
}
});
// 按_id条件查询 返回的是一个对象 若无匹配项,则返回null
Blog.findById('5d78a30d1eab6f21d3f5c92f', (err, ret) => {
if (err) {
console.log('查询失败')
} else {
console.log('查询成功');
console.log(ret)
}
});
删除数据
/**
* 删除数据
*/
// 只删除一组匹配项
Blog.deleteOne({
title: '测试1'
}, (err, ret) => {
if (err) {
console.log('删除失败')
} else {
console.log('删除成功');
console.log(ret)
}
});
// 删除所有符合的匹配项
Blog.deleteMany({
title: '测试1'
}, (err, ret) => {
if (err) {
console.log('删除失败')
} else {
console.log('删除成功');
console.log(ret)
}
});
更新数据
/**
* 更新数据
*/
// 只更新查询到的第一组符合条件的文档
Blog.updateOne({
author: '张三1'
}, {
info: '222'
}, (err) => {
if (err) {
console.log('更新失败')
} else {
console.log('更新成功');
console.log(ret)
}
});
// 更新所有匹配项的文档
Blog.updateMany({
author: '张三1'
}, {
info: '223'
}, (err, ret) => {
if (err) {
console.log('更新失败')
} else {
console.log('更新成功');
console.log(ret)
}
});