您的位置:首页 > 数据库 > Mongodb

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

2016-04-06 21:06 661 查看
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



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  node.js mongodb