vue2.0开发聊天程序(七) mongoose操作
连接
开启你的mongodb服务
首先确保你已安装了mongodb,并且配置了mongodb的环境变量。
在任意目录(建议在非中文目录)下新建database文件夹,在此文件夹下新建test文件夹(确保此文件夹为空的)。
然后打开cmd,输入:
mongod --dbpath 'test文件夹的绝对路径———— E:\database\test'
waiting for connections on port 27017 说明你已经在localhost:27017端口上开启了服务。
此时再进入test文件夹,里面会有许多WT文件。
创建连接
新建一个index.js(任意目录,最好新建一个mongodbDemo文件夹便于管理)。
var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/test'); var db = mongoose.connection; db.on('error',console.error.bind(console,'mongodb连接错误:')); db.once('open',function(){ console.log('mongodb connection is OK!'); });
安装mongoose依赖包,运行此文件
npm install mongoose node index.js
说明已成功连接到数据库。
写入第一条数据 Create
mongoose写入数据的方法有两个,分别是Model.create()和Documents.save()[即上文的Entity];
1.在写入数据之前,先新建一个model
var CatSchema = new mongoose.Schema({ // 新建一个model对象 name: String }); var CatModel = mongoose.model('Cat', CatSchema); // 这一步才正式写入数据库,数据库对应的model名为Cat
2.插入一条数据
//Model.create CatModel.create({name: 'ketty'},function(err,res){ // 第一个参数规定为错误信息 console.log(err); console.log(res); }) //promise写法 CatModel.create({ name: 'kitty' }).then(res=>{console.log(res)}) // 成功返回当前数据 .catch(err=>{console.log(err)}); // Documents.save() var catDoc = new CatModel({name:'ketty'}); catDoc.save(function (err, res) { if (err)console.log(err); console.log(res); });
基于Model的查询
简单查询
Model.find().then(res=>{ // 传空匹配所有 log(res); }).catch(err=>{ log(err); }); Model.find({name: 'kitty'}).then(res=>{ // 匹配name为kitty的所有数据 log(res); // 若为查询到数据 res为[] }).catch(err=>{ log(err); }); Model.findOne({name: 'kitty'}).then(res=>{ // 匹配name为kitty的第一条数据 log(res); // 若为查询到数据 res为null }).catch(err=>{ log(err); }); Model.findById(id).then(res=>{// 根据id查询 // tido }).catch(err=>{ // tido })
find和findOne只接受Object作为参数,如果未传参数则默认为{}。传其他数据类型都会抛出异常
条件查询
“$lt” 小于
“$lte” 小于等于
“$gt” 大于
“$gte” 大于等于
“$ne” 不等于
// 查询 age 大于等于18并小于等于30的文档 Model.find({'age':{ '$get':18 , '$lte':30 } } );
或查询
‘$in’ 一个键对应多个值
‘$nin’ 同上取反, 一个键不对应指定值
“$or” 多个条件匹配, 可以嵌套 $in 使用
“$not” 同上取反, 查询与特定模式不匹配的文档
// 查询 age等于20或21或21或’haha’的文档 Model.find({'age':{ '$in':[20,21,22.'haha']} } ); // 查询 age等于18 或 name等于’xueyou’ 的文档 Model.find({'$or' : [ {'age':18} , {'name':'xueyou'} ] });
类型查询
"$exists" 是否存在某属性
null 能匹配自身和不存在的值, 想要匹配键的值为null, 就要通过 “$exists” 条件判定键值已经存在
// 查询 age值为null的文档 Model.find('age' : { '$in' : [null] , 'exists' : true } ); //查询所有存在name属性的文档 Model.find({name: {$exists: true}}); //查询所有不存在telephone属性的文档 Model.find({telephone: {$exists: false}});
正则表达式
MongoDb 使用 Prel兼容的正则表达式库来匹配正则表达式
// 查询name为 joe 的文档, 并忽略大小写 Model.find( {'name' : /joe/i } ) //查询匹配各种大小写组合 Model.find( {'name' : /joe?/i } )
查询数组
‘$all’ 匹配数组中多个元素
‘$size’ 匹配数组长度
‘$slice’ 查询子集合返回
// 查询 array(数组类型)键中有10的文档, array : [1,2,3,4,5,10] 会匹配到 Model.find({'array':10} ); //查询 array(数组类型)键中下标5对应的值是10, array : [1,2,3,4,5,10] 会匹配到 Model.find({'array[5]':10} ); //查询 匹配array数组中 既有5又有10的文档 Model.find({'array':[5,10]} ); // 查询 匹配array数组长度为3 的文档 Model.find({'array':{'$size' : 3} } ); // 查询 匹配array数组的前10个元素 Model.find({'array':{'$skice' : 10} } ); //查询 匹配array数组的第5个到第10个元素 Model.find({'array':{'$skice' : [5,10] } } );
Where_javacript语句查询
用$where可以执行任意javacript语句作为查询的一部分,如果回调函数返回 true 文档就作为结果的一部分返回
Model.find({"$where": function() { if (this.x !== null && this.y !== null) { return this.x + this.y === 10 ? true : false; // retrun将替代返回结果 } else { return true; } } }) Model.find( {"$where" : "this.x + this.y === 10" } ) // this指向Model Model.find( {"$where" : " function(){ return this.x + this.y ===10; } " } )
联表查询
要实现联表查询需要将连接的Model的主键_id指向需要对应Model的某个属性上。使用populate进行查询
实现方法如下:
// *****************创建Model************ var cityModel= mongoose.model('city', { cityName: String, townList: [] }); var countryModel = mongoose.model('country', { country: String, cityList:[{ type: mongoose.Schema.ObjectId, ref: 'city' // 将'sity'Model的主键与country的cityList对应 }] }); // ****************插入数据************************ cityModel.create({cityName:'shanghai',townList:['lujiazui']}); cityModel.create({cityName:'guangzhou',townList:['tianhe']}); cityModel.create({cityName:'beijing',townList:['zhaoyang']}); var countryObj = { country:'china', cityList:[] } cityModel.find().then(res=>{ //将所有数据查出,并将对应的_id存入数组 for(let i in res){ countryObj.cityList.push(res[i]._id); } // 插入国家数据 countryModel.create(countryObj,function(err,res){ console.log(err); console.log('res' + res); }); }); // ****************查询结果********************** countryModel.find().then(res=>{ // 普通查询 console.log(res); }).catch(err=>{ console.log(err); }) /*结果为 [ { cityList: [ 5a4ded2b78110500d8b94726, 5a4ded2b78110500d8b94725, 5a4ded2b78110500d8b94727 ], _id: 5a4df149c249713348a2f546, country: 'china', __v: 0 } ] */ countryModel.find({country: 'china'}).populate('cityList').then(res=>{ // populate查询 console.log(res); }) /* [ { cityList: [ [Object], [Object], [Object] ], _id: 5a4df149c249713348a2f546, country: 'china', __v: 0 } ] */
游标
limit(3) 限制返回结果的数量
skip(3) 跳过前3个文档,返回其余的
sort( 'username':1 , 'age':-1 } ) 排序 键对应文档的键名, 值代表排序方向, 1 升序, -1降序
更新数据
‘$inc’ 增减修改器,只对数字有效.下面的实例: 找到 age=22的文档,修改文档的age值自增1
Model.update({'age':22}, {'$inc':{'age':1}});
‘$set’ 指定一个键的值,这个键不存在就创建它.可以是任何MondoDB支持的类型.
Model.update({'age':22}, {'$set':{'age':'haha'}});
‘$unset’ 删除一个键
Model.update({‘age’:22}, {’$unset’:{‘age’:‘haha’} } );
数组更新
‘$push’ 给一个键push一个数组成员,键不存在会创建
Model.update({'age':22}, {'$push':{'array':10} } );
‘$addToSet’ 向数组中添加一个元素,如果存在就不添加
Model.update({'age':22}, {'$addToSet':{'array':10} } );
‘$each’ 遍历数组, 和 $push 修改器配合可以插入多个值
Model.update({'age':22}, {'$push':{'array':{'$each': [1,2,3,4,5]}} } );
‘$pop’ 向数组中尾部删除一个元素
Model.update({'age':22}, {'$pop':{'array':1} } );
‘$pull’ 向数组中删除指定元素
Model.update({'age':22}, {'$pull':{'array':10} } );
删除
Model.remove(conditions,callback); // conditions为查询条件,可参考find