Node.js简单操作MongoDB(CRUD)

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

你可能感兴趣的:(node-js)