- GitHub:https://github.com/Automattic/mongoose
- 英文文档:https://mongoosejs.com/docs/guide.html
- 中文文档:http://www.mongoosejs.net/docs/guide.html
- 如何使用nodejs写一个接口 - MySQL版
shardb-mongodb模块操作数据库不好去使用,比如查询,新建等,所以这个模块只用作ot服务那边;
另外使用mongoose去操作数据库方便写接口
schema的相关配置为connection
- 之前的增删改查笔记:https://github.com/wztlink1013/web-learn-notes/blob/gh-pages/learn-nodejs/express/model/connect.js
- mongoose踩坑笔记: Cannot overwrite `` model once compiled.
安装
MongoDB以及可视化工具Navicat
参考之前写的文章:MongoDB下载及使用+Navicat使用+服务器上的配置
安装mongoose
cnpm install mongoose -S
使用
连接数据库语句
// 连接数据库 mongoose .connect('mongodb://127.0.0.1:27017/test-mongoose', { useNewUrlParser: true, useUnifiedTopology: true, }) .then(() => { console.log('数据库连接成功') }) .catch(() => { console.log('数据库连接失败') })
然后再将这个js文件require到app.js里面使用
// 数据库连接 require('./model/connect')
创建集合
- 先利用函数mongoose的schema函数构建一个规则
- 然后利用model函数创建一个集合并且用上这个规则
// Schema:数据库集合的结构对象。 // 创建一个集合(相当于sql里面的设定一个表)规则 let TestSchema = new mongoose.Schema({ name: { type: String }, age: { type: Number, default: 0 }, email: { type: String }, time: { type: Date, default: Date.now }, }) // Model :由Schema构造而成,可操作数据库。 // 创建一个集合(并且应用上面的规则) let TestModel = mongoose.model('schema', TestSchema)
增加文档
- 第一个参数:create函数
- 第二个参数:可以打印相关信息(doc和err)
// 创建(创建完执行以便之后就注释掉,不然会一直重复创建) TestModel.create( [ { name: 'test-1', age: 8 }, { name: 'test-2', age: 18 }, { name: 'test-3', age: 28 }, { name: 'test-4', age: 38 }, { name: 'test-5', age: 48 }, { name: 'test-6', age: 58, email: 'tttt@qq.com' }, { name: 'test-7', age: 68, email: 'ssss@qq.com' }, { name: 'test-8', age: 18 }, { name: 'test-9', age: 18, email: 'rrrr@qq.com' }, { name: 'test-10', age: 18 }, ], (error, docs){ if (error) { console.log(error) } else { console.log('save ok') console.log(docs) } } )
- 也可以创建一个对象赋值给一个变量,然后该变量利用函数save即可保存到数据库
创建完执行以便之后就注释掉,不然会一直重复创建
查询文档
- 查询函数
findOne
:返回第一条数据 - 查询函数
find
:查询所有包含条件的数据
// 查询 TestModel.find( // 28<= age <48 { age: { $gte: 28, $lt: 48 } }, // 1为指定字段,0为排除字段 { name: 1, age: 1, _id: 0 }, function (err, docs) { if (err) { console.log('查询出错: ' + err) } else { console.log('$gte,$lte查询结果为: ') console.log(docs) } } )
mongoose条件查询
键为变量时用
中括号括起来就行了
checkStr(data.type_id, 'email') ? (type_str = 'email') : (type_str = 'user_id') Model_user.find({ [type_str]: data.type_id }, {}, (err, docs) => {}
逻辑查询
参考:
Model_user.find( { $or: [{ email: obj.email }, { user_id: obj.user_id }] }, {}, (err, docs) => {} )
更新文档
User.updateOne({查询条件}, {要修改的值}).then(result => console.log(result))
- updateOne:更新单个
- updateMany:更新多个
// 更新 let conditions_1 = { name: 'test-3' } let update = { $set: { age: 11 } } TestModel.updateOne(conditions_1, update, function (error) { if (error) { console.log(error) } else { console.log('Update success!') TestModel.find( { name: 'test-3' }, { name: 1, age: 1, _id: 0 }, function (err, docs) { if (err) { console.log('查询出错: ' + err) } else { console.log('更新test-3后的查询结果为: ') console.log(docs) } } ) } })
删除文档
- 删除单个:
User.findOneAndDelete({})then(result => console.log(result))
- 删除多个:
User.deleteMany({}).then(result => console.log(result))
- deleteOne:删除单个
// 删除 let conditions_2 = { name: 'test-2' } TestModel.deleteOne(conditions_2, function (error) { if (error) { console.log(error) } else { console.log('Delete success!') TestModel.find( { name: 'test-2' }, { name: 1, age: 1, _id: 0 }, function (err, docs) { if (err) { console.log('查询出错: ' + err) } else { console.log('删除test-2后的查询结果为: ') console.log(docs) } } ) } })
mongoose验证
required: true 必传字段
minlength:3 字符串最小长度
maxlength: 20 字符串最大长度
min: 2 数值最小为2
max: 100 数值最大为100
enum: ['html', 'css', 'javascript', 'node.js']
trim: true 去除字符串两边的空格
validate: 自定义验证器
default: 默认值
获取错误信息:error.errors['字段名称'].message
整体代码
/* * @Author: wztlink1013 * @Date: 2022-01-11 12:43:02 * @LastEditTime: 2022-01-11 16:44:13 * @Description: */ const mongoose = require('mongoose') // 连接数据库 mongoose .connect('mongodb://127.0.0.1:27017/test-mongoose', { useNewUrlParser: true, useUnifiedTopology: true, }) .then(() => { console.log('数据库连接成功') }) .catch(() => { console.log('数据库连接失败') }) // Schema:数据库集合的结构对象。 let TestSchema = new mongoose.Schema({ name: { type: String }, age: { type: Number, default: 0 }, email: { type: String }, time: { type: Date, default: Date.now }, }) // Model :由Schema构造而成,可操作数据库。 let TestModel = mongoose.model('schema', TestSchema) // Entity:由Model创建的实体,可操作数据库。 // let TestEntity = new TestModel({ // name: 'helloworld', // age: 28, // email: 'helloworld@qq.com', // }) // console.log(TestEntity) // 创建(创建完执行以便之后就注释掉,不然会一直重复创建) // TestModel.create( // [ // { name: 'test-1', age: 8 }, // { name: 'test-2', age: 18 }, // { name: 'test-3', age: 28 }, // { name: 'test-4', age: 38 }, // { name: 'test-5', age: 48 }, // { name: 'test-6', age: 58, email: 'tttt@qq.com' }, // { name: 'test-7', age: 68, email: 'ssss@qq.com' }, // { name: 'test-8', age: 18 }, // { name: 'test-9', age: 18, email: 'rrrr@qq.com' }, // { name: 'test-10', age: 18 }, // ], // function (error, docs) { // if (error) { // console.log(error) // } else { // // console.log('save ok') // // console.log(docs) // } // } // ) // 查询 TestModel.find( // 28<= age <48 { age: { $gte: 28, $lt: 48 } }, // 1为指定字段,0为排除字段 { name: 1, age: 1, _id: 0 }, function (err, docs) { if (err) { console.log('查询出错: ' + err) } else { console.log('$gte,$lte查询结果为: ') console.log(docs) } } ) // 更新 let conditions_1 = { name: 'test-3' } let update = { $set: { age: 11 } } TestModel.updateOne(conditions_1, update, function (error) { if (error) { console.log(error) } else { console.log('Update success!') TestModel.find( { name: 'test-3' }, { name: 1, age: 1, _id: 0 }, function (err, docs) { if (err) { console.log('查询出错: ' + err) } else { console.log('更新test-3后的查询结果为: ') console.log(docs) } } ) } }) // 删除 let conditions_2 = { name: 'test-2' } TestModel.deleteOne(conditions_2, function (error) { if (error) { console.log(error) } else { console.log('Delete success!') TestModel.find( { name: 'test-2' }, { name: 1, age: 1, _id: 0 }, function (err, docs) { if (err) { console.log('查询出错: ' + err) } else { console.log('删除test-2后的查询结果为: ') console.log(docs) } } ) } })
评论区