配置
- 打开MongoDB-bin文件夹,进入命令行
- data文件夹要存在
mongod --dbpath=E:data
- 重新打开命令行,输入mongo
常用命令
- db 查看当前数据库
- db.user.insert({}); 向当前数据库中的user集合中插入一个文档
- db.user.find() 查看当前数据库中user集合的全部文档
通过NODE对数据库进行操作
- 安装模块
npm install mongoose
- 引入模块
var mongoose=require('mongoose')
- 连接数据库
mongoose.connect('mongodb://127.0.0.1:27017') //27017---端口号
- 定义数据库的骨架模型,规定了集合中文档的字段名和字段类型
var UserSchema=new mongoose.Schema({ username:String, age:Number, level:Number },{collection:'user'}) //collection:在数据库中存储的集合的名称,没有指定connection,集合名=模型名->小写->复数 Person->person->people //注意:如果不加字段就不能添加此字段
- 定义可以操作数据库的模型,可以定义多个模型,但是名字不可以相同
var User=mongoose.model('User',UserSchema)
向集合中插入文档
- 这是个异步的方法
User.create({username:'zfpx',age:1},function(err,result)){ console.log(result); }
- 可以存放数组批量保存
var Person=mongoose.model('Person',personSchema); var users=[]; for(var i=0;i<=10;i++){ users.push({name:'zfpx'+i,age:i}) } Person.creat(users,function(err,docs){ console.log(docs) })
查询数据库中的数据
- 一般来说返回整个文档用docs,返回更改后的字段result
- 查找名字是zfpx1的
User.find({username:'zfpx1'},function(err,docs){ console.log(docs) })
- 查找所有以zfpx开头的
User.find({username:/^zfpx/},function (err,docs) { console.log(docs) });
- 查找age>3的
- 查找age<3的
User.find({age:{$lt:3}},function (err,docs) { console.log(docs) });
修改数据
- 将大于3的数据添加一个level
User.update({age:{$gt:3}},{level:1},{multi:true},function (err,result) { console.log(result) });
- 默认只更新匹配后的第一条
- multi:true}表示匹配到多少条更新多少条
- {$inc:{level:1}} -> 在原来的基础上增加1,递增
User.update({age:{$gt:3}},{$inc:{level:1}},{multi:true},function (err,result) { console.log(result) })
- 参数
- param1:修改的范围
- param2:更改的内容
- param3:回调函数
- { ok: 1, nModified: 1, n: 2 }
- n:匹配到的记录数
- nModified :实际更新的记录数
删除数据
User.remove({age:{$gt:1}},function (err,result) { console.log(result.result) });
属性过滤
find:查询所有
- name:1表示name需要显示,其他的不显示,但是_id会自动显示,所以可以将_id设置为0,不显示
Person.find({},{name:1,_id=0},function(err,docs){ })
findOne:最多查找一个
Person.findOne({username:'zfpx',age:1},function(err,docs){
if(err){
}else{
if(docs){
console.log('登陆成功')
}else{
consloe.log('用户名或密码不正确')
}
}
})
findById:根据ID查找
Person.findById(_id,function(err,docs){ if(err){ }else{ if(docs){ console.log('登陆成功') }else{ consloe.log('用户名或密码不正确') } } })
游标
- skip:跳过指定的条数
- limit:限定返回的条数,限定返回的最大条数
- sort(1):排序,1是顺序,0是反序,否则没有顺序
- exec:此时才会执行
- 返回一个对象
//每页的条数 var pageSize=3; //当前是第几页 var pageNumber=2; Person.find().sort({age:1}).skip(3).limit(3).exec(function (err,docs) { console.log(docs) });
插件
- 把会话信息保存在mongodb数据库中,要依赖session,session中间件用于保存用户数据
var session=require('express-session'); var MongoStore=require('connect-mongo')(session); app.use(session({ resave:true, saveUninitialized:true, secret:'zfpx', <!--指定会话的存储位置--> store:new MongoStore({ url:'mongodb://127.0.0.1/201614blog' }) }));
- flash 是 session 中一个用于存储信息的特殊区域。消息写入到 flash 中,在跳转目标页中显示该消息。flash 是配置 redirect 一同使用的,以确保消息在目标页面中可用。
- 会增加req.flash,存一次取一次,之后就被销毁,依赖session
- 存:req.flash(type,msg);取:req.flash(type);
- 可以多次写入,所以这是一个数组,所以取得时候转为字符串,一般写在中间件中多次使用
var flash=require('connect-flash'); app.use(flash()); User.create(user,function (err,docs) { if(err){ //req.session.error='注册失败' req.flash('error','注册失败'); res.redirect('back');//从哪里来回哪里去 }else { req.flash('success','注册成功'); res.redirect('/user/signin') } });
app.use(function (req,res,next) { res.locals.success=req.flash('success').toString(); res.locals.error=req.flash('error').toString(); next(); });
MongoDB文档的主键_id
- 在MongoDB中,如果不特别指定,每个文档都会生成一个唯一的ObjectId作为其主键_id的值。MongoDB中数据的基本单元称为文档(Document)。文档是MongoDB的核心概念,多个键极其关联的值有序的放置在一起便是文档。
- 在多个骨架中,我们可能需要用到别人家的主键,方法是:
-
var ObjectId=mongoose.Schema.Types.ObjectId; var UserSchema=new mongoose.Schema({ }); var ArticleSchema=new mongoose.Schema({ createAt:{type:Date,default:Date.now}, <!-- 因为别人家主键的类型是ObjectId,ref:引用 --> //ref:'User'引用User的主键 user:{type:ObjectId,ref:'User'} });