MongoDB
开源,高性能的 NoSQL 数据库;支持索引、集群、复制和故障转移、各种语言的驱动程序;高伸缩性;
NoSQL 毕竟还处于发展阶段,也有说它的各种问题的: http://coolshell.cn/articles/5826.html
官网地址: http://www.mongodb.org/
API Docs: http://docs.mongodb.org/manual/
node-mongodb-native
mongodb 的 nodejs 驱动;
GitHub 地址: https://github.com/mongodb/node-mongodb-native
官方安装说明: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/
按照官方说明在 win7 64 位环境下配置还是遇到了问题,我还是把我安装配置的过程写一下
下载 MongoDB 并安装
下载地址: http://www.mongodb.org/downloads
创建数据库和日志存放目录
在 C 盘根目录下新建 "M_DB" 和 "M_LOG" 两个文件夹,分别存放数据库文件和日志文件
创建一个 config 文件
打开目录 "C:\Program Files\MongoDB 2.6 Standard\bin",并在此目录下新建一个 mongo.config 文件,文件内容如下
- ##数据库目录
- dbpath=C:\M_DB
- ##日志输出文件
- logpath=C:\M_LOG\mongodb.log
添加环境变量
在环境变量 PATH 中加入 "C:\Program Files\MongoDB 2.6 Standard\bin"
以 Windows 服务器运行 MongoDB
以管理员方式打开 CMD 窗口,运行如下命令安装 MongoDB 服务,可以在 "控制面板 \ 所有控制面板项 \ 管理工具 \ 服务" 找到名为 "MongoDB" 的服务右键启动
- mongod--config "C:\Program Files\MongoDB 2.6 Standard\bin\mongo.config"--install
启动服务
在 CMD 窗口中运行如下命令,也可以在可以在 "控制面板 \ 所有控制面板项 \ 管理工具 \ 服务"
- net start mongodb
测试连接
在 CMD 中运行如下命令,查看结果
- mongo
安装成功!
最后两步非必需;MongoDB 默认端口是 27017,可以修改!
对于 "C:\Program Files\MongoDB 2.6 Standard\bin" 目录下的 exe 程序,做个简单的说明,可能更利于了解可以做些什么操作,基础学习关注 mongod.exe 和 mongo.exe 即可
mongo.exe:客户端,支持 js 语法
mongod.exe:服务端
mongodump.exe:备份工具
mongorestore.exe:恢复工具
mongoexport.exe:导出工具
mongoimport.exe:导入工具
mongostat.exe:实时性能监控工具
mongotop.exe:跟踪 MongDB 实例读写时间工具
更多详细解释或操作可以查看: http://docs.mongodb.org/manual/reference/program/
MongoDB 已经安装好,下面先对 MongoDB 进行一个简单的入门,再用 node-mongodb-native 去操作 MongoDB
库操作
新建数据库:第一步:use 新建数据库名;第二步:进行此库相关的操作;如果不进行第二步,该数据库不会被创建
查看数据库:show dbs;
新建表:db.createCollection('要新建的表名');
查看当前数据库下表: show collections;
删除当前数据库指定表:db. 表名. drop();
删除当前数据库:db.dropDatabase();
示例操作如下图:
1. 默认为存在 "admin" 和 "local" 两个数据库;admin 数据库是存放管理员信息的数据库,认证会用到;local 是存放 replication 相关的数据;这两处本篇都没有涉及到;
2.find(); 是个查询操作,后面会讲到,上面用到主要是为了演示 use 不存在的库后,进行相关操作会创建出这个库;
3.MongoDB 没有像 MySQL 或 MSSQL 等数据库这么严格的规定,不是非得要先建库、建表、建各种字段,以后的操作中慢慢的会体会到 ^_^!
插入
方法一:db. 表名. insert(数据);
1. 从上图操作可以看出,没有去创建 "tb1" 表,其实通过插入操作也会自动创建
2._id,是 mongodb 自已生成的,每行数据都会存在,默认是 ObjectId,可以在插入数据时插入这个键的值 (支持 mongodb 支持的所有数据类型)
方法二:db. 表名. save(数据);
1. 从上图操作可以看出,save 也可达到 insert 一样的插入效果
2._id 可以自已插入
3. 一个表中不一定要字段都相同
那它们有什么区别
从图中操作就可以看出,虽然 insert 和 save 方法都可以插入数据,当默认的 "_id" 值已存在时,调用 insert 方法插入会报错;而 save 方法不会, 会更新相同的_id 所在行数据的信息
查询
查询表中所有数据:db. 表名. find();
按条件查询(支持多条件):db. 表名. find(条件);
查询第一条(支持条件):db. 表名. findOne(条件);
限制数量:db. 表名. find().limit(数量);
跳过指定数量:db. 表名. find().skip(数量);
从上图中可以看出具体用法,批量插入默认数据我用了一个 javascript 语法循环;
比较查询
大于:$gt
小于:$lt
大于等于:$gte
小于等于:$lte
非等于:$ne
上面看到了 AND 的关系,或者的关系应该怎么用?
或者:$or
in 和 not in 查询 (包含、不包含)
$in
$nin
查询数量:db. 表名. find().count();
排序:db. 表名. find().sort({" 字段名 ":1});
1:表示升序 -1:表示降序
指定字段返回: db. 表名. find({},{" 字段名 ":0});
1:返回 0:不返回
查询就讲到这里了,感觉查询示例一下讲不完,还有些高级查询,大家自行去了解一下吧 ^_^!
修改
前面 save 在_id 字段已存在是就是修改操作,按指定条件修改语法如下
db. 表名. update({"条件字段名":"字段值"},{$set:{" 要修改的字段名 ":" 修改后的字段值 "}});
删除
db. 表名. remove(条件);
存储过程
创建存储过程:
- db.system.js.save({_id:"存储过程ID",
- value:function(参数){
- -- 逻辑主体;
- return 返回;
- }});
调用存储过程
- db.eval("存储过程ID()");
所有存储过程都存放在 db.system.js 中
MongoDB 基本操作就讲这么多了,基本够用,深入学习大家自已去看看 API^_^!
先用 npm 安装 mongodb
- npm install mongodb
安装成功后,继续在上面操作创建的库和表中操作
插入
- var MongoClient = require('mongodb').MongoClient;
- var DB_CONN_STR = 'mongodb://localhost:27017/wilsondb1';
- var insertData = function(db, callback) {
- //连接到表
- var collection = db.collection('tb2');
- //插入数据
- var data = [{"name":'wilson001',"age":21},{"name":'wilson002',"age":22}];
- collection.insert(data, function(err, result) {
- if(err)
- {
- console.log('Error:'+ err);
- return;
- }
- callback(result);
- });
- }
- MongoClient.connect(DB_CONN_STR, function(err, db) {
- console.log("连接成功!");
- insertData(db, function(result) {
- console.log(result);
- db.close();
- });
- });
查询
- var MongoClient = require('mongodb').MongoClient;
- var DB_CONN_STR = 'mongodb://localhost:27017/wilsondb1';
- var selectData = function(db, callback) {
- //连接到表
- var collection = db.collection('tb2');
- //查询数据
- var whereStr = {"name":'wilson001'};
- collection.find(whereStr).toArray(function(err, result) {
- if(err)
- {
- console.log('Error:'+ err);
- return;
- }
- callback(result);
- });
- }
- MongoClient.connect(DB_CONN_STR, function(err, db) {
- console.log("连接成功!");
- selectData(db, function(result) {
- console.log(result);
- db.close();
- });
- });
修改
- var MongoClient = require('mongodb').MongoClient;
- var DB_CONN_STR = 'mongodb://localhost:27017/wilsondb1';
- var updateData = function(db, callback) {
- //连接到表
- var collection = db.collection('tb2');
- //更新数据
- var whereStr = {"name":'wilson001'};
- var updateStr = {$set: { "age" : 100 }};
- collection.update(whereStr,updateStr, function(err, result) {
- if(err)
- {
- console.log('Error:'+ err);
- return;
- }
- callback(result);
- });
- }
- MongoClient.connect(DB_CONN_STR, function(err, db) {
- console.log("连接成功!");
- updateData(db, function(result) {
- console.log(result);
- db.close();
- });
- });
删除
- var MongoClient = require('mongodb').MongoClient;
- var DB_CONN_STR = 'mongodb://localhost:27017/wilsondb1';
- var delData = function(db, callback) {
- //连接到表
- var collection = db.collection('tb2');
- //删除数据
- var whereStr = {"name":'wilson001'};
- collection.remove(whereStr, function(err, result) {
- if(err)
- {
- console.log('Error:'+ err);
- return;
- }
- callback(result);
- });
- }
- MongoClient.connect(DB_CONN_STR, function(err, db) {
- console.log("连接成功!");
- delData(db, function(result) {
- console.log(result);
- db.close();
- });
- });
调用存储过程
- var MongoClient = require('mongodb').MongoClient;
- var DB_CONN_STR = 'mongodb://localhost:27017/wilsondb1';
- var invokeProcData = function(db, callback) {
- //存储过程调用
- db.eval('get_tb2_count()',
- function(err, result) {
- if (err) {
- console.log('Error:' + err);
- return;
- }
- callback(result);
- });
- }
- MongoClient.connect(DB_CONN_STR,
- function(err, db) {
- console.log("连接成功!");
- invokeProcData(db,
- function(result) {
- console.log(result);
- db.close();
- });
- });
到此 CRUD 操作就完成,通过回调函数的 result 参数进行判断都可以进行业务逻辑的进一步组合!
本篇针对 node-mongodb-native 操作 MongoDB 没有做更深的讲解,原因是针对它的进行再次封装的东西很多,且更利于编程实现,比如: mongoose 、 mongoskin 、 mongolian 等等,应用性不错;
mongoose 的可能用的比较多...
本文中很多地方我都还是习惯的用表、行等术语去描述,其实对 NoSQL 来说并不对,只是有助于习惯了关系型数据库的开发人员来解;
文章中 "表" 本应该描述为 "collection(集合)";"行" 应该描述为 "文档(document)", 一个 database 中可以有多个 collection,一个 collection 中又可以有多个 document
文章中并没有涉及认证的部分,大家自行去补一下,非常简单,我文中也挺到了两个默认数据库中的 "admin" 数据库
用 CMD 中使用 mongo.exe 操作时,插入中文遇一了问题,原因是 MongoDB 默认编辑是 utf-8,而 CMD 是 GBK,所以在 CMD 窗口中执行这个命令修改编辑即可:chcp 65001
注意 mongodb 严格区分大小写,比如查询 db.tb2.find({"name":"wilson0"}) 和 db.tb2.find({"Name":"wilson0"}) 并不是用的同一字段做的条件;
主要参考资料:
http://docs.mongodb.org/manual/
https://github.com/mongodb/node-mongodb-native
MongoDB 权威指南
来源: https://cloud.tencent.com/developer/article/1006926?fromSource=gwzcw.705226.705226.705226