1,使用官方的 mongodb 包来操作
https://github.com/mongodb/node-mongodb-native
2,使用第三方 mongoose 来操作 MongoDB 数据库
mongoose 是基于 MongoDB 官方的 mongodb 包再一次做了封装
官网 https://mongoosejs.com/
中文版 http://www.mongoosejs.net/
安装
npm i mongoose
使用
使用前要连接mongoDB net start mongoDB
基本步骤
创建数据库
在 mongoDB 中不需要显式创建数据库, 如果正在使用的数据库不存在, MongoDB 会自动创建。
连接数据库
const express = require("express")
const mongoose = require("mongoose")
const app = express()
// 27017是mongoDB 的默认端口
// 使用mongoose提供的connect方法连接数据库
// 不用管 usertable 存不存在,没有的话会在插入第一条数据库的时候创建
mongoose.connect('mongodb://localhost/usertable',{useUnifiedTopology: true,useNewUrlParser: true}).then(()=>{
console.log('数据库链接成功')
}).catch(err=>{
console.log('数据库链接失败',err)
})
app.listen(3000,()=>{
console.log("mongoose测试 服务器启动")
})
设计集合
1 对集合设定规则 2 创建激活 创建 mongoose.Schema构造函数的实例即可创建
// 1 连接数据库 usertable
mongoose.connect("mongodb://localhost/usertable",{useUnifiedTopology: true,useNewUrlParser: true})
// 2 设计集合 (表结构,文档结构) 设定集合规则
// 字段名称就是表结构中的属性名称
// 约束:是为了保证数据的完整性,不要有脏数据
var userScrema = new Schema({
usernmae:{
type: String,
required: true, //userNmae不能为空
default:0, //默认值
},
password:{
type: String,
required: true
},
gender:{
type:Number,
enum:[0,1], //取值范围
default:0
},
email:{
type: String
},
// hobbies:[String] // 值是数组 且每一项都是字符串
created_time:{ //创建时间
type: Date,
// 这里不要写 Date.now() 会即时调用 默认值就固定了
// 当 new Model 的时候,如果没有传递 create_time 则mongoose就会调用default 指定方法
default: Date.now
},
last_modified_time:{ //最后一次修改时间
type: Date,
default: Date.now
},
sex:{ //性别
type:Number,
enum:[-1, 0, 1], // 取值区间 保密 男 女
default: -1
},
})
// 3 把集合发布为模型
// mongoose.model 将一个集合发布为模型
// 第一个参数:传入一个大写名词单数据字符串来表示你的 数据表名称
// mongoose 会自动将大写名词的字符串生成 小写复数 的集合名称
// User --> users
// 第一个参数:文档结构
// 返回值:模型构造函数
var User = mongoose.model("User",userScrema)
// 4 操作数据 users
操作数据 users 支持.then
创建文档 create
// 创建多条 User.create([{...},{...},...]).then((ret)=>{console.log(ret) })
User.create({
usernmae: "张三2--2",
password: "123",
email: "email@email.com"
},(err, ret)=>{
console.log(ret) //当前插入的文档
})
// 或者
User.create({
usernmae: "张三2--2",
password: "123",
email: "email@email.com"
}).then((ret)=>{
console.log(ret) //当前插入的文档
}).catch(err=>{
})
增 save
var admin = new User({
usernmae: "张三",
password: "123",
email: "email@email.com"
})
admin.save(function(err,ret){
if(err){
console.log("保存失败")
}else{
console.log("保存成功",ret)
}
})
查询文档
查询所有 find
User.find(function(err,ret){
if(err){
console.log("查询失败")
}else{
console.log("查询成功:",ret)
}
})
条件查询 返回数组 find
User.find({ usernmae:"张三"},function(err,ret){
if(err){
console.log("查询失败")
}else{
console.log("查询成功:",ret)
}
})
条件查询的第一个 返回对象 findOne
User.findOne({usernmae:"张三"},function(err,ret){
if(err){
console.log("查询失败")
}else{
console.log("查询成功:",ret)
}
})
findOne没有条件 获取第一条数据
User.findOne().then(res=>console.log("查询成功:",res))
// 或者
User.findOne(function(err,ret){
if(err){
console.log("查询失败")
}else{
console.log("查询成功:",ret)
}
})
匹配大于 小于 find
匹配大于20 小于50
User.find({age:{>:20,<:50}}).then(res=>console.log(res))
匹配包含 $in
匹配 hobbies 字段(['敲代码','打豆豆']
)中包含 '敲代码’的数据
User.find({hobbies:{&in:['敲代码']}}).then(res=>console.log(res))
查询某个字段的值 select
select 传入要查询的字段 多个以空格隔开 如果要排除某个字段-name
加短斜杠
User.find().select('usernmae email').then(res=>console.log(res))
排除id
User.find().select('usernmae email -_id').then(res=>console.log(res))
对查询出来的数据排序 sort
年龄排列 升序sort('age')
降序 sort('-age')
User.find().sort('age').then(res=>console.log(res))
skip 跳过多少条 limit 查询数量 可用于分页
从 跳过前2条开始查询 10条数据 可用于分页
User.find().skip(2).limit(10),then(res=>console.log(res))
删除文档
删除多条数据 remove deleteMany
删除 usernmae 为张三的所要文档
// 如果传 {} 会删除 User集合中的所要文档
// 返回 {n:4,ok:1} n删除的数据条数 ok:1成功0失败
User.deleteMany({usernmae:"张三"}).then(res=>console.log("删除成功:",res))
// 或者
// 返回 { n: 0, ok: 1, deletedCount: 0 }
User.remove({usernmae:"张三"}).then(res=>console.log("删除成功:",res))
删除一条数据 findOneAndDelete findOneAndRemove
查找一条文档并删除 (如果匹配了多条,会删除第一条) 返回删除的文档
User.findOneAndDelete({password:"123"}).then(res=>console.log("删除成功:",res))
// 或者
User.findOneAndRemove({password:"123"}).then(res=>console.log("删除成功:",res))
根据id删除一条数据
User.findByIdAndRemove()
更新文档
更新多条数据 updateMany update
根据条件更新所有
如果传 {} 会更新所要文档
// updateMany({查询条件},{要修改的值})
// 返回 { n: 2, nModified: 2, ok: 1 } nModified修改的数据
User.updateMany({gender:0},{gender:1}).then(res=>console.log("更新成功:",res))
// 或者
// 返回 { n: 2, nModified: 2, ok: 1 }
User.update({},{gender:1}).then(res=>console.log("更新成功:",res))
更新一条数据 updateOne findOneAndUpdate
// updateOne({查询条件},{要修改的值})
// 返回 { n: 1, nModified: 1, ok: 1 }
User.updateOne({gender:0},{gender:1}).then(res=>console.log("更新成功:",res))
// 或者
// 返回 修改后的文档对象
User.findOneAndUpdate({gender:1},{gender:0}).then(res=>console.log("更新成功:",res))
根据id更新一条数据
User.findByIdAndUpdate('5dfc3026fcd1f338ac1541ce',{password:"456789"}).then(res=>console.log("更新成功:",res))
mongoDB 导入数据
mongoimport -d 数据库名称 -c 集合名称 --file 要导入的数据文件
user.json
{
"nmae":"admin3",
"password":"456789",
"hobbies":["敲代码"],
"email":"email@email.com"
}
// 或
[{...},{...},...]
导入 usertable数据库 users表 数据文件目录 user.json
mongoimport -d usertable -c user2 --file ./user.json
当json 是数组的时候 要加上
mongoimport -d usertable -c user2 --jsonArray --file ./user.json
在 MongoDB Compass 可查看数据
添加多条数据