node.js学习日志(五)—— Mongodb

介绍:

在了解Mongodb之前一直以为Mongodb是芒果数据库,其实芒果的英文是:Mango,两者好像没有关系。

Mongodb是nosql家族中的重要一员,它是文档型数据库,说白了就是mysql的行 = Mongodb的文档。不同于mysql行的字段,Mongodb的文档键非常灵活,不用事先定义也不会固定不变,当然键也不必定义什么“inter型,varchar型”等等。而且Mongodb设计初衷就是让用户易于使用,分布式,切片等等一些功能只需使用缺省自动设置就能满足大部分用户的需求了。

可以说从易用性来讲Mongodb要远远的方便与传统关系型数据库。

性能测试:

从性能上来说呢?有网友经过测试,我们直接拿他的测试结果来看把:

原文地址:http://www.cnblogs.com/inrie/archive/2011/02/22/1961415.html

在100W数据和1000W数据插入和查询时,Mongodb的效率分别都是mysql的4倍和2倍。

而且Mongodb是从2008年就开始发展起来的,至今也有3个年头了,其稳定性也经过时间的考验。

所以对于这样一个效率高,门槛低,稳定性好的数据库我们没有理由说不。

安装和启动流程:

1、安装Mongodb非常容易,不需要编译,直接去官网下载对应操作系统的版本

官网地址:

http://www.mongodb.org/

2、下载好以后在指定目录解压缩:tar –zxvf (tar包名字) //在本目录下解压了

3、进入Mongodb安装目录,在bin文件夹中,输入./mongod +参数(具体参数可以详见手册) ,这样就可以启动Mongodb数据库了

node.js的Mongodb插件:node-mongodb-native

是不是很简单,然后我们利用node.js的node-mongodb-native插件来操作Mongodb数据库。

插件下载地址:

https://github.com/christkv/node-mongodb-native

官方使用API说明:https://github.com/christkv/node-mongodb-native/tree/master/docs

这个API写的很详细相当好,分以下几段:

1
2
3
4
5
6
7
Database :数据库
Collections : 集合
Querying documents :查询文档
Inserting/updating documents :插入、更新文档
GridStore :GridFS文件存储
Indexes :索引
Replicasets :分布式管理副本集

官方示例提供的expample我个人觉得不大好,我们重新写一个:

1
2
3
var mongodb = require("mongodb"),   
mongoserver = new mongodb.Server("127.0.0.1", 27017,{}), //连接Mongodb
db_connector = new mongodb.Db('test', mongoserver, {}); //这里如果test数据库不存在则创建它,如果存在则连上它

注意:在创建mongoserver时第3个参数有一个:poolSize属性,官方说明: specify the number of connections in the pool, default is 1。

看上去好像可以替代连接池的东西,用generic-pool还是用node-mongodb-native自带的连接池这看个人喜好吧。

1
2
3
4
db_connector.open(function(err, db){
//dosomething
db.close(); //这只是关闭对“test”的连接,不会切断对Mongodb的连接,所以用完就关闭他
}

具体的操作代码还是看官方提供的API比较靠谱,说的也很详细,我简单将调试代码帖上来参考下:

1、创建文档集合“testcollection”,并且插入一条文档{test:”value”}

1
2
3
db.createCollection("testcollection", function(err, collection){
collection.insert({"test":"value"});
});

2、先选择”testcollection”集合,然后更新{a:4}的文档为{author:”12312213”},然后返回查看整个文档集合”testcollection”的所有文档。

1
2
3
4
5
6
7
8
9
db.collection("testcollection", function(err, collection){
collection.update({a:4}, {$set: {author:"12312213"}},function(err, x){
console.log(arguments.length)
//注意:这里可能我的mongodb版本是1.8+,官方提供的说明是:the second is the count of records that were modified.但是这里无法返回,不过问题也不大。
collection.find().toArray(function(err, r){
console.log(r)
})
})
});

3、先选择”testcollection”集合,cursor.count代表通过 collection.find({})返回的文档数量cursor.toArray()表示将这些返回的文档数组化。

1
2
3
4
5
6
7
8
9
10
db.collection("testcollection", function(err, collection){
var cursor = collection.find({});
cursor.count(function(err, count){
console.log("Total matches: "+count);
});
cursor.toArray(function(err, results){
console.log(results.length)
console.log(results[0]._id)
})
});

其他一些功能也没一一测试,不过开发时对照这API应该很轻松就完成了对Mongodb的操作。

另外推荐一本Mongodb入门书籍,图灵出版的 《Mongodb权威指南》,书挺好的,可以大致了解整个Mongodb的优势和一些操作命令。