首先介绍一下执行环境,node.js是必须要安装的,另外本文使用的是mongoose模块,由于链接的是本地数据库,所以本文例子运行本地的MongoDB,需要另外安装,如果连的是网上的,可以不用本地装MongoDB。另外,express不是必须的。
运行版本(node v5.11.0 + mongoose ^4.4.20)
安装模块后第一件事就是引用,首先,在node入口(如app.js,下面所有代码都放在这个文件内)引入mongoose模块并打开连接
var mongoose = require('mongoose');
var db =mongoose.createConnection('localhost','test');
//上条字段"test"可以不用改,因为安装mongoDB时自带这个数据库
另外需要注意的是,mongoose连接的时候有createConnection和connect两个不同的方法,具体区别可以在网上查,本文就不罗嗦了。
接下来,要写schema,model,他们的作用边写边说。紧接上条代码,先写schema
var usersSchema = new mongoose.Schema({name:String,age:Number}); //注意大小写哦
如你看到的,Schema的作用是可以用来定义UsersSchema的格式,当然你可以在插入数据的时候添加额外的字段,例如sex,只不过如果你插入age的时候插入了字符串,这条记录就会插入失败。(可是name插入Number的时候会被转化为String并插入成功)
然后就是model
var usersModel = db.model('users',usersSchema);
//第一个参数对应MongoDB的collection名(类似关系型数据库table名),第二个参数传入mogoose.schema
接下来,可以开始CRUD了!
插入有两种方式,第一种是在model上使用create(doc,callback)直接插入,第二种是从model中实例化一个entity使用save(callback)出来插入,分别如下,请注意参数:
//方法一:model上使用create(doc,callback)
var doc={name:"myName",age:18};
usersModel.create(doc,function(error){
if(error){
console.log(error);
}else{
console.log('created!')
}
})
//如果这个usersModel.create(doc,callback)方法使用两次,那么数据库会插入两条记录
//方法二:entity上使用save(callback)
var userEntity = new usersModel({name:"Myname2"});
userEntity.save(function(error){
if(error){
console.log(error);
}else{
console.log('saved!')
}
});
//如果这里userEntity.save(callback)使用两次,那么数据库里也只有一条记录
update(criteria,objNew,option,callback)操作可以使用model,不过需要注意几点
update操作默认只更新第一条匹配的记录,如果需要所有匹配,需在如下参数中设置
参数criteria 对象类型,查询条件
参数objNew 对象类型,更新对象(含操作符,如$set,具体可百度mongo操作符)
参数option 对象类型,内有upsert,muti,writeConcern 可选意义分别为
upsert 布尔值,如果没有更新对象,是否插入此新对象(可选)
muti 布尔值,如果匹配的记录有多条,是否更新所有匹配的记录(可选)
writeConcern 抛出异常的级别(可选)
//model上使用update更新
usersModel.update({age:18},{name:"c"},{upsert:false,multi:true},function(error){
if(error){
console.log(error);
}else{
console.log('updated!')
}
})
remove(conditions,callback)同样可以用model的方法
//model上使用remove删除
usersModel.remove({age:18},function(error){
if(error){
console.log(error);
}else{
console.log('deleted!')
}
})
下面说说对于entity上的删除,不敢兴趣可以直接跳过看查询
因为shell中remove可以只删除第一条记录的,比如db.users.remove({age:18},true),后面的true代表only one的意思,不过model的remove可不支持这种写法,那么moogose怎么删除单条记录呢,这里尝试利用model创建过的实体userEntity来删除,代码如下
var userEntity1 = new usersModel({name:"entity1"});
var userEntity2 = new usersModel({name:"entity2"});
//插入 userEntity1 两次, userEntity2 一次 (同一entity save()两次只在db上插入一次)
userEntity1.save(function(error){
if(error){
console.log(error);
}else{
console.log('entity1_1 saved!')
}
});
userEntity1.save(function(error){
if(error){
console.log(error);
}else{
console.log('entity1_2 saved!')
}
});
userEntity2.save(function(error){
if(error){
console.log(error);
}else{
console.log('entity2 saved!');
//删除userEntity1一次
userEntity1.remove(function(error){
if(error){
console.log(error);
}else{
console.log('entity1_1 and entity1_2 deleted!')
}
});
}
});
/*
console的结果:
entity1_2 saved!
entity1_1 saved!
entity2 saved!
entity1_1 and entity1_2 deleted!
注意:关于异步,entity1_1.save() 、entity1_2.save()、entity2.save()的执行顺序是不一定的,所以我试验中entity1_2比entity1_1先返回
mongoDB的结果:
>db.users.find()
{"_id":"ObjectId(....)","name":"entity2"}
*/
然后结果是,同一个entity的记录被删除了
查询find(doc,callback)可以写在model上,如
// find(doc,callback)在Model上的使用,借用上面定义的model,请注意参数
usersModel.find({name:"entity"},function(error,result){
if(error){
console.log(error);
}else{
console.log(result);
}
})
扩展一下,schema可以写方法,schema写方法两种,一种是给实例(entity)用的,一种是给model用的,看例子介绍,下面代码中,我们用前面定义过的usersSchema,用查询做例子
//schema.statics 定义给Model使用的方法
usersSchema.statics.findbyname(name,callback){
return this.model('usersModel').find({name:name},callback)
}
//用Model使用此方法
usersModel.findbyname('userEntity2',function(error,result){
if(error){
console.log(error);
}else{
console.log(result);
}
})
另外一种方式
//schema.methods 定义给实例使用的方法
usersSchema.methods.findbyname(name,callback){
return this.model('usersModel').find({name:name},callback)
}
//创建实例使用此方法
var userEntity3 = new usersModel({});
userEntity3.findbyname('userEntity2',function(error,result){
if(error){
console.log(error);
}else{
console.log(result);
}
})
这样注释是不对的,只是方便看。。。
>show dbs //查看数据库(可不查)
>use test //切换数据库,如没有,则新建
>db.createCollection("users") //新建users集合,类似于关系型数据库的table
>show collections //查看集合(可不查)
>db.users.find() //查看集合下所有记录,不填参数代表查全部
>db.users.insert({name:"userEntity",age:18}) //插入记录
>db.users.find()
>db.users.update({age:18},{name:"nameupdated"},false,true) //更改(age为18)记录的name的值为"nameupdated",如果没有name则插入,如果匹配多条则全部更新
>db.users.find({name:"nameupdated"})
>db.users.remove({}) //若不填则删除该集合下全部记录
>db.users.find()
以上
QQ号:285482599
有错请指出