- 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函数创建一个集合并且用上这个规则 ```javascript // 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)
<a name="lC5j4"></a>### 增加文档- 第一个参数:create函数- 第二个参数:可以打印相关信息(doc和err)```javascript// 创建(创建完执行以便之后就注释掉,不然会一直重复创建)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即可保存到数据库 :::danger 创建完执行以便之后就注释掉,不然会一直重复创建 :::
查询文档
查询函数
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) => {}
逻辑查询
参考:
- 文档:http://mongoosejs.net/docs/queries.html
-
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:删除单个
```javascript
// 删除
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)}}
<a name="NvcCP"></a>### mongoose验证required: true 必传字段<br />minlength:3 字符串最小长度<br />maxlength: 20 字符串最大长度<br />min: 2 数值最小为2<br />max: 100 数值最大为100<br />enum: ['html', 'css', 'javascript', 'node.js']<br />trim: true 去除字符串两边的空格<br />validate: 自定义验证器<br />default: 默认值获取错误信息:error.errors['字段名称'].message<a name="Fa0Tc"></a>### 整体代码```javascript/** @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)}})}})

其他
- mongoose查询到的对象无法读取问题
mongodb创建集合
