连接
开启你的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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。