- 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创建集合