node.js中如何使用mongodb数据库

1 选择mysql还是mongodb:

       如果你的业务通常能知道key,那么MongoDB是一个好选择,比如某游戏的玩家信息,这是很典型的NoSQL的应用场景。另外一点是mongodb可以存储多种数据类型,比如我们想存一个列表,在MySQL中就只能拼成字符串来存,但是NoSQL本身就支持列表,所以可以尽可能的保持数据结构。此外mongodb具有并发量大,可以集群,存储量大。但是他有千分之几的概率有写丢失。

       mysql的强项是关系模型,在不知道主键的情况下,查询的灵活性和效率都能得到很好地优化,适合网站这类的应用,因为很难提前确定要根据某个条件进行查询,关系模型的表达能力是很强的。Mysql并发一般,适合查询。例如用户信息等重要数据可以用mongodb存储。

        当然node.js开发中,redis用的也很多,redis是个强大的缓存组件,node出现之后,在与redis通讯时,不走原来的那种线程机制,而是走事件驱动,原来的IO瓶颈没有了,非常有利于提供高并发。

2 node.js中使用mongodb

mongodb简介:

      ①MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源的NoSQL数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能,相比MySQL那样的关系型数据库,它更显得轻巧、灵活,非常适合在数据规模很大、事务性不强的场合下使用。

      ②MongoDB旨在为WEB应用提供可扩展的高性能数据存储解决方案;

      ③MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB文档类似于 JSON对象。字段值可以包含其他文档,数组及文档数组。

       安装好mongodb后,在安装目录下打开cmd,执行mongod --datapath=E:\mongodb\data,data是数据库的存储位置。在执行:mongo --host:127.0.0.1,启动mongodb数据库。

mongoose简介:

         Mongoose是MongoDB的一个对象模型工具,是基于node-mongodb-native开发的MongoDB nodejs驱动,可以在异步的环境下执行。同时它也是针对MongoDB操作的一个对象模型库,封装了MongoDB对文档的的一些增删改查等常用方法,让Node.js操作Mongodb数据库变得更加灵活简单。

        ①集合collection和文档document:mongodb是一个对象数据库,所有数据以document存储,它是一个关联数组式的对象,内部由属性构成,相当于mysql中的一条记录,多个document组成collection,相当于mysql中一张表中的数据。

        ②Schema:一种以文件形式存储的数据库模型骨架,无法直接通往数据库端,也就是说它不具备对数据库的操作能力,仅仅只是数据库模型在程序片段中的一种表现,可以说是数据属性模型(传统意义的表结构),又或着是“集合”的模型骨架。定义一个Schema:

         ③Model:由Schema构造生成的模型,除了Schema定义的数据库骨架以外,还具有数据库操作的行为,类似于管理数据库属性、行为的类。拥有了Model,我们也就拥有了操作数据库的能力。创建Model:

    var StudentModel = db.model("qiqi", StudentSchema); //qiqi是数据库中集合的名称

         ④ Entity:由Model创建的实体,使用save方法保存数据,Model和Entity都有能影响数据库的操作,但Model比Entity更具操作性。创建entity:

   var studentEntity = new StudentModel({ name : "qiqi", age : 44, email: "qiqi@qq.com"}); //实际是插入了数据

 

完整的过程 :

//1 加载模块
var mongoose = require("mongoose");
//2. 连接数据库 mongod 服务器端  mongo客户端
//数据库的名称可以是不存在
var db = mongoose.connect("mongodb://134.66.121.144:27017/qizhiqq");
//如果连接成功会执行error回调
db.connection.on("error", function (error) {
    console.log("数据库连接失败:" + error);
});
//如果连接成功会执行open回调
db.connection.on("open", function () {
    console.log("数据库连接成功");
});
//定义一个 schema,描述此集合里有哪些字段,字段是什么类型
var StudentSchema = new mongoose.Schema({
    name : { type:String },
    home : { type:String },
    age  : { type:Number, default:0 },
    time : { type:Date, default:Date.now },
    email: { type:String,default:''}
});
//创建模型,可以用它来操作数据库中的student集合,指的是整体
var StudentModel = db.model("student", StudentSchema);

//根据模型创建实体,是指的个体对象
var StudentEntity = new StudentModel({
    name : "qiqi",
    age  : 11,
    email: "qiqi@qq.com",
    home:'shanghai'
});
//用save 方法把自己保存到数据库中
StudentEntity.save(function(error,data){
       if(error){ 
            console.log("error :" + error); 
       }else{ 
             console.log(data); 
       }
});

//也可以用model的create方法直接实现以上两步
<pre>PersonModel.create({ name:"qiqi", age:8}, function(error,doc){
    if(error) {
        console.log(error);
    } else {
        console.log(doc);
    }
}); 
 
 

               ⑤基本操作之查询:查询分很多种类型,如条件查询,过滤查询等等,这里只说最基本的find查询。

Model.find({},function(error,docs){
   //若没有向find传递参数,默认显示所有文档
});

Model.find({ "age": 44}, function (error, docs) {
  if(error){
    console.log("error :" + error);
  }else{
    console.log(docs); //docs是 age为44的所有文档
  }
});

                 其他查询方法:

            1  返回满足查询条件的第一条数据findOne() ;

            2 按照ID查询数据:findById(_id,callback());

            3 find过滤:对显示返回结果进行过滤,相当于mysql中select后的字段。例如:Model.find({age:8},{name:1,age:1,_id:0},callback());_id是默认返回,如("_id":0)则表示不显示,但对其他不需要显示的属性且不是_id,如果设置为0的话将会抛异常或查询无果。

        ⑥基本操作之更新:Model.update(查询条件,更新内容,回调函数);

StudentModel.update({age:8},{$set:{age:7}},function(err){
    if(err){
        console.log("error :" + err);
    }else{
        console.log(doc);
    }
})//默认匹配第一条,要更新所有:StudentModel.update({age:8},{$set:{age:7}},{multi:true},function(err){...})

         ⑦基本操作之删除:Model.remove(查询条件,回调函数)

        基本操作之高级查询:通过操作符:$in:包含,$gt:大于,$It:小于,$ne:不等于,$or:或,$exists:是否存在,来设定条件进行查询。例如:

     Model.find({name:{$ne:qiqi}},callback());  //查询名字不是qiqi的document
     Model.find({age:{$gt:5},name:{$exists:true}},callback());// 查询age大于5,并且name存在的document
     Model.find({$or:[{name:'qiqi'},{age:8}]},callback());    //查询name是qiqi或者age是8的document





                
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值