一、概念
mongodb就是非关系型数据库,而非关系型数据库是不能通过横向纵向去定位一条数据,它的结构更像是一个数组里放了很多个json数据。
二、设置
(1)设置数据文件和日志文件储存位置
按自己的爱好设置文件的储存位置,本安装文档的储存位置设置在E盘,目录如下
E:\MongoData
├─data #MongoDB数据库中的数据的储存位置
└─log #MongoDB数据库中的日志的储存位置
└─mongodb.log # MongoDB数据库中的日志的储存文件 (创建方式:创建一个txt,把后缀名改为log)
(2)配置mongodb服务
- 设置mongodb的环境变量
属性>高级系统设置>环境变量>找到系统变量中的path变量
向path变量的结尾处添加mongodb的安装目录下bin目录的地址(如果原来的path路径后面没有分号,需要添加一个英文的分号再添加mongodb的目录)
如果按本文档安装的mongodb安装目录下bin目录为:
C:\Program Files\MongoDB\Server\3.4\bin
设置完成后依次点击确定,就设置好了mongodb的环境变量了
- 安装mongodb服务
第一步:按照设置的储存位置,修改下面的命令
(ps:如果是按本文档设置的储存位置,不用在做更改)
mongod --logpath "E:\MongoData\log\mongodb.log" --logappend --dbpath "E:\MongoData\data" --directoryperdb --serviceName "MongoDB" --serviceDisplayName "MongoDB" --install
#命令中字段的说明
*** --logpath 指定MongoDB日志文件的存储路径,注意是指定文件不是目录
*** --logappend 使用追加的方式写日志
*** --dbpath 指定数据库数据的存储路径
*** --directoryperdb 每个DB都会新建一个目录
*** --serviceName 指定服务名称
*** --serviceDisplayName 指定服务名称,有多个mongodb服务时执行。
*** --install 指定作为一个Windows服务安装。
打开cmd命令行,输入上面第一步修改好的指令回车(ps:一定要以管理员身份运行),(运行完成没有任何错误提示,表示设置成功)
三、基本操作:
- net start MongoDB
- net stop MongoDB
- mongo :进入mongodb的命令状态
- show dbs :显示当前的数据库
- show collections:显示当前的数据库拥有的表
- use 数据名 :切换数据库 或 创建新的数据库
- db.createCollection("表名字") :向数据库里面添加表
- db.表名.drop() :用来从数据库中删除一个表
- db.dropDatabase() :删除当前正在使用的数据库
- db.表名.insert({...}) :插入数据
- db.表名.find() :查看数据
小于 <
大于 >
大于等于 >=
小于等于 <=
如:
db.t1.find({age:{$lt:5}}) 就可以查找age小于5的全部数据
db.t1.find({age:{$lt:5,$gt:1}}) 就可以查找age小于5大于1 的全部数据 (多个筛选条件之间使用逗号分隔 )
- db.表名.update( {修改的条件} , {修改器:{修改内容}} , 第三个参数 , 第四个参数 )
修改器: $set 修改 $unset删除字段 $inc 当于编程语言中的 “+=”
第三个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
第四个参数 ,默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- db.表名.remove({条件})
- Mongo中支持使用 js代码,包括申明变量、循环等等
- 导出:mongoexport可以把一个collection导出成JSON格式或CSV格式的文件。可以通过参数指定导出的数据项,也可以根据指定的条件导出数据。
语法:
mongoexport -d dbname -c collectionname -o file --type json/csv -f field
参数说明:
-d :数据库名
-c :collection名
-o :输出的文件名file
--type : 输出的格式,默认为json
-f :输出的字段,如果-type为csv,则需要加上-f "字段名"fileld
示例:
mongoexport -d mongotest -c users -o D:/users.json --type json -f "_id,user_id,user_name,age,status"
- 导入:
语法:
mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv -f field
参数说明:
-d :数据库名
-c :collection名
--file :要导入的文件
--type :导入的格式默认json
-f :导入的字段名
--headerline :如果导入的格式是csv,则可以使用第一行的标题作为导入的字段
示例:
mongoimport -d mongotest -c users --file D:/users.json --type json
四、node.js操作mongodb
先创建一个项目文件夹,然后再该位置命令行进行初始化:npm init
然后安装控制模块:
npm install mongodb@2.2.33 --save
在demo1.js写入增删查改代码,可以逐个注释进行测试
var mongo = require("mongodb"); //引入mongodb模块
var assert = require("assert"); //引入断言模块
var MongoClient = mongo.MongoClient; //开启服务
var Urls = "mongodb://localhost:27017/demo1"; //url储存 放在连接池中。
MongoClient.connect(Urls,function(err,db){ //获取连接
assert.equal(null,err); //使用断言模块代替以前的 if判断
/**
//插入数据
db.collection("t1").insert({"name":"xiaoming"},function(err,result){ //连接到数据库上面,并使用参数传入集合
assert.equal(null,err);
console.log(result);
db.close();
});
//查找数据
db.collection("t1").find({"name":"xiaoming"}).toArray(function(err,result){
assert.equal(null,err);
console.log(result);
db.close();
})
//删除数据
db.collection("t1").deleteOne({"name":"xiaoming"},function(err,result){ //连接到数据库上面,并使用参数传入集合
assert.equal(null,err);
console.log(result);
db.close();
});
**/
//修改数据
db.collection("t1").update({"name":"zhang"},{$set:{"name":"xiaoming"}},function(err,result){ //连接到数据库上面,并使用参数传入集合
assert.equal(null,err);
console.log(result);
db.close();
});
});
操作方法的封装:dbhandler.js
var mongo=require("mongodb");//@2.2.11
var MongoClient = mongo.MongoClient;
var assert = require('assert');
var host="localhost";
var port="27017";
var Urls = 'mongodb://localhost:27017/demo2';//demo2是自己的数据库名
//add一条数据
var add = function(db,collections,selector,fn){
var collection = db.collection(collections);
collection.insertMany([selector],function(err,result){
assert.equal(err,null);
fn(result);//错误处理函数
db.close();
});
}
//delete
var deletes = function(db,collections,selector,fn){
var collection = db.collection(collections);
collection.deleteOne(selector,function(err,result){
try{assert.equal(err,null)}catch(e){
console.log(e);
}
fn(result);
db.close();
});
};
//find
var find = function(db,collections,selector,fn){
var collection = db.collection(collections);
collection.find(selector).toArray(function(err,docs){
try{
assert.equal(err,null);
}catch(e){
console.log(e);
docs = [];
}
fn(docs);
db.close();
});
}
//update
var updates = function(db,collections,selector,fn){
var collection = db.collection(collections);
console.log(selector);
collection.updateOne(selector[0],selector[1],function(err,result){
assert.equal(err,null);
assert.equal(1,result.result.n);
fn(result);
db.close();
});
}
//(权限控制) -- 暂时没有用
MongoClient.connect(Urls, function(err, db) {
find(db,"powers",null,function(d){
console.log("123s");
console.log(d.length);
});
});
//方法都赋值到操作对象上,便于调用
var methodType = {
login:find,
show:find,
add:add,
getpower:find,
update:updates,
delete:deletes,
updatepass:updates,
adduser:add,
usershow:find,
getcategory:find,
getcourse:find,
find:find,
state:find,
top:find,
AddDirectory:find,
updateDirectory:updates,
deleteDirectory:deletes,
showlist:find,
showdir:find
};
//主逻辑
module.exports = function(req,res,collections,selector,fn){
MongoClient.connect(Urls, function(err, db) {
assert.equal(null, err);
console.log("Connected correctly to server");
methodType[req.query.action](db,collections,selector,fn);
db.close();
});
};
五、记录一个node的自动重启模块
- npm install supervisor -g
- supervisor demo.js
- 改变下demo.js中输出的代码,将 response.end("haha") 中输出的内容该变,比如改为 response.end("hehe hehe hehe"),然后直接刷新页面,就可以看到修改的结果被输出了(以前我们需要重新运行 node demo.js才可以)
- 最好只对创建了http服务的node文件才用supervisor运行,如果一般的文件这样运行,会不断的重启,很耗费内存。