Node.js简单操作MongoDB(CRUD)

来源:互联网 发布:福州专业淘宝美工培训 编辑:程序博客网 时间:2024/05/19 11:48

Node.js简单操作MongoDB(CRUD)


首先介绍一下执行环境,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可以写方法,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);    }     })

MongoDB shell(选看,以上操作对应的shell命令)

这样注释是不对的,只是方便看。。。

>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
有错请指出

0 0
原创粉丝点击