MongoDb数据库指令以及Nodejs操作mongodb数据库进行增删改查示范代码
安装文档 http://www.runoob.com/mongodb/mongodb-window-install.html
1 | 在安装目录bin下启动命令窗口mongo.exe启动数据库 |
官方说明 http://mongodb.github.io/node-mongodb-native/3.1/quick-start/quick-start/
文档手册 https://dashidan.com/article/mongodb/basic/1.html
案例代码 https://www.cnblogs.com/zhuminghui/p/8330429.html
mongoose中文文档 https://cn.mongoosedoc.top/docs/guide.html
mongoDb数据库
- 安装mongoDb数据库
- 配置环境变量
- mongo 看环境变量是否配置成功
- 然后创立一个文件夹 不能有中文空格之类的
- cmd 在安装目录bin下输入命令 mongod –dbpath F:\mongodb 启动命令找到你创建的文件夹 启动数据库
- 注意cmd不能关闭 关闭等于关闭数据库(相当于mongodb的服务端)
一些命令
- cls清屏
- show dbs 查看所有数据库列表
- show collections显示所有表
在开一个cmd相当于我们的客户端(必须重开cmd)
客户端 mongo 使用数据库
show dbs 可以看我们当前有哪些数据库
连接远程数据库 mongo 127.0.0.1:27017
MongoDB 数据库创建删除、表(集合)创建删除、数据增删改查
创建数据库和使用数据库
use student 但是现在还没有创建成功(使用这个数据库也是这个命令)
如果真想把这个数据库创建成功必须要插入一个数据表
数据库中不能直接插入数据,只能往集合(collections)中插入数据。不需要专门创建集合,只需要写点语法插入数据就会创建集合:
db.user.insert({“name”:”xiaoming”});(创建user这个表并插入一条数据)
db.user系统发现 user 是一个陌生的集合名字,所以就自动创建了集合。
show dbs 数据库student也创建成功
显示当前的数据集合(mysql 中叫表)
show collections
要是想在创建表 先use student 表示在student这个数据库里操作
db.admin.insert({“admin”:”wa”,”password”:”123456”}) 创建admin表
插入增加数据
db.表名.insert({“name”:”zhangsan”});
insertOne 插入单条数据(node操作数据库的指令)
insertMany 插入福哦条数据 最好不用数据由丢失情况(node操作数据库的指令)
查找所有数据
1
2db.表名.find()
相当于:select * from 表名查找指定数据
db.表名.find({“age”:20,”name”:”zhangsan”})
也可以查找多个字段 查找age等于20并且查找name等于zhangsan的数据
1
2
3
4db.表名.find({"age":20})
查找age=20的数据
相当于: select * from userInfo where age = 22;
相当于:select * from 表名db.表名.find({age: {$gt: 22}});查询 age > 22 的记录 相当于:select * from userInfo where age >22;
db.表名.find({age: {$lt: 22}});查询 age < 22 的记录相当于:select * from userInfo where age <22;
db.表名.find({age: {$gte: 25}});查询 age < 25 的记录 相当于select * from userInfo where age >= 25;
db.表名.find({age: {$gte: 25}});查询 age >= 25 的记录相当于:select * from userInfo where age >= 25;
db.表名.find({age: {$lte: 25}});查询 age <= 25 的记录
db.表名.find({age: {$gte: 23, $lte: 26}});查询 age >= 23 并且 age <= 26
查询指定字段中包含的关键词 模糊查询用于搜
1
2
3
4
5{"title":"这是一篇文章"}
{"title":"男装文章"}
- 查询 name 中包含 文章 的数据
- db.表名.find({name: /文章/});
- 相当于 select * from 表名 where name like ‘%mongo%’;查询 name 中以 zh 开头的
1
2
3
4
5
6
7{"name":"zhang"}
{"name":"wang"}
{"name":"zhangsan"}
- db.表名.find({name: /^zh/});
{"name":"zhang"}
{"name":"zhangsan"}
- select * from 表名 where name like ‘mongo%’;查询指定列 name、age 数据
1
2
3//{} {} 第一个是条件
db.表名.find({}, {name: 1, age: 1});//只返回字段为name、age的所有数据
相当于:select name, age from 表名;查询指定列的name、age 字段并且是age>25的数据,
1
2db.表名.find({age: {$gt: 25}}, {name: 1, age: 1});
相当于:select name, age from 表名 where age >25;按照年龄排序 1 升序 -1 降序
1
2升序:db.表名.find().sort({age: 1});
降序:db.表名.find().sort({age: -1});查询 name = zhangsan, age = 22 的数据
1
2db.表名.find({name: 'zhangsan', age: 22});
相当于:select * from 表名 where name = ‘zhangsan’ and age = ‘22’;查询前5条数据 分页
1
2db.表名.find().limit(5)
相当于 selecttop 5 * from 表名查询10条以后的数据 分页
1
2
3
4
5db.表名.find().skip(15)
相当于 select* from 表名 where id not in{
selecttop 10 * from 表名
}查询5-10之间的数据 分页
1
2
3
4
5
6- 查询10条数据跳过5条
db.表名.find().limit(10).skip(5)
可用于分页 limit是pageSize,skip是第几页*pageSize
db.表名.find().skip(0).limit(5)//第一页(0-1)*2
db.表名.find().skip(2).limit(5)//第二页(2-1)*2
db.表名.find().skip(4).limit(5)//第三页(3-1)*2or 与查询
1
2
3- 查找age为22并且是25的所有数据
db.表名.find({$or:[{age:22},{age:25}]})
相当于 select* from 表名 where age=22 or age=25findOne 查询第一条数据
1
2
3db.表名.findOne()
相当于 selecttop 1 * from 表名
相当于 db.表名.find().limit(1)查询某个结果集的记录条数 统计数量
db.表名.find().count() 总条数
1
2
3
4
5db.表名.find({age:{$gte:25}}).count()
相当于 select count(*).from 表名 where age >= 25
相当于 db.表名.find().limit(1)
如果要返回限制之后的记录数量 需要使用count(true)或者count(非0)
db.表名.find().skip(10).limit(5).count(true)删除集合(表)db.COLLECTION_NAME.drop()
db.表名.drop()
删除数据库
use 数据库名
db.dropDatabase()
删除集合中的数据
1
2将age为34的数据删除掉 一样的都会被删除
db.表明.remove({"age":34})只删除一条数据
1
db.表明.remove({"age":34},{justOne:true})
修改数据
update只要一样的都会修改
updateOne 修改一条数据(node操作数据库的指令)
修改里边还有查询条件 你要改谁就告诉mongo
查询名字叫小明的,把年龄改为16岁 update({条件},{设置})
初始数据 {“name”:”小明”,”age”:15,”sex”:”男”}
1
2
3
4//把小明年龄改为16
db.表名.update({"name":"小明"},{$set:{"age":16}})
//更改小明的年龄和性别
db.表名.update({"name":"小明"},{$set:{"age":18,"sex":"女"}})注意必须带$set 如果没有 就会完整替换
初始数据{“name”:”小明”,”age”:15,”sex”:”男”}
1
2db.表名.update({"name":"小明"},{"age":18,"sex":"女"})
初始数据变成{"age":18,"sex":"女"}name别替换掉了mongodb索引和explain命令
索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得更快。MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查询优化技巧。
创建索引的命令
数据量过大查询数据会非常耗时,但是设置索引会大大的节省查询时间
1
2
3
4db.user.ensureIndex({"username":1})
当查询username字段的数据的时候查询的执行时间就会非常快
db.user.find({"username":"admin"}).explain( "executionStats" )获取当前集合的索引:
1
db.user.getIndexes()
删除索引的命令是:
1
db.user.dropIndex({"username":1})
查询数据具体的执行时间
1
2db.表名.find().explain( "executionStats" )
关注输出的如下数值:explain.executionStats.executionTimeMillis:毫秒数在 MongoDB 中,我们同样可以创建复合索引
数字 1 表示 username 键的索引按升序存储,-1 表示age 键的索引按照降序方式存储。
1
db.user.ensureIndex({"username":1, "age":-1})
该索引被创建后,基于 username 和 age 的查询将会用到该索引,或者是基于 username 的查询也会用到该索引,
*但是只是基于 age 的查询将不会用到该复合索引。因此可以说, 如果想用到复合索引,必须在查询条件中包含复合索引中的前 N 个索引列*
。然而如果查询条件中的键值顺序和复合索引中的创建顺序不一致的话,MongoDB 可以智能的帮助我们调整该顺序,以便使复合索引可以为查询所用。如:1
db.user.find({"age": 30, "username": "stephen"})
唯一索引
1
db.user.ensureIndex({"userid":1},{"unique":true})
如果再次插入 userid 重复的文档时,MongoDB 将报错,以提示插入重复键,如:
1
2db.user.insert({"userid":5})
db.user.insert({"userid":5})报错 E11000 duplicate key error index: user.user.$userid_1 dup key: { : 5.0 }
如果在创建唯一索引时已经存在了重复项,我们可以通过下面的命令帮助我们在创建唯一索引时消除重复文档,仅保留发现的第一个文档,如:
1 先删除刚刚创建的唯一索引
1
db.user.dropIndex({"userid":1})
2 插入测试数据,以保证集合中有重复键存在。
1
2
3db.user.remove()
db.user.insert({"userid":5})
db.user.insert({"userid":5})重新创建唯一索引
1
db.user.ensureIndex({"userid":1},{"unique":true })
如果在为已有数据的文档创建索引时,可以执行下面的命令,以使 MongoDB 在后台创建索引,这样的创建时就不会阻塞其他操作。但是相比而言,以阻塞方式创建索引,会使整 个创建过程效率更高,但是在创建时 MongoDB 将无法接收其他的操作。
1
db.user.ensureIndex({"username":1},{"background":true})
Nodejs操作MongoDb数据库
*mongodb是2.2版本的看官方2.x版本的API*
说明文档 http://mongodb.github.io/node-mongodb-native/2.2/quick-start/quick-start/
安装命令 npm install mongodb –save-dev
引入数据库 MongoClient
var MongoClient = require(‘mongodb’).MongoClient;
数据库的地址 student表示数据库的名称
var DBurl = ‘mongodb://localhost:27017/student’;
连接数据库 MongoClient.connect
在运行环境中进入MongoDB的安装位置,进入bin文件夹下,运行如下代码:
1
D:\Mongodb\bin> mongod --dbpath D:\Mongodb\data
可以通过访问http:\localhost:27017,可以看到如下提示:表示连接成功
It looks like you are trying to access MongoDB over HTTP on the native driver port.
1
2
3
4//连接数据库
MongoClient.connect(url, function(err, db) {
});实现对数据的增加修改删除
1
2
3
4
5
6MongoClient.connect(url, function(err, db) {
//对user这个表进行一系列操作
db.collection('user').insertOne({'name':'zhangsan'},function(error,data){
})
}增加数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23//连接数据库,这是一个异步的操作
MongoClient.connect(DBurl,function(err,db){
res.writeHead(200,{"Content-Type":"text/html;charset=UTF8" });
if(err){
res.send("数据库连接失败");
return;
}
res.write("恭喜,数据库已经成功连接 \n");
//增加数据 (插入的数据 callback)
db.collection("user").insertOne({
"name":"哈哈",
"age",20
},function(err,data){
if(err){
res.send("数据库写入失败");
return;
}
res.write("恭喜,数据已经成功插入");
res.end();
//关闭数据库
db.close();
})
})修改数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20MongoClient.connect(DBurl,function(err,db){
res.writeHead(200,{"Content-Type":"text/html;charset=UTF8" });
if(err){
res.send("数据库连接失败");
return;
}
//修改一条数据 ({要修改的数据},{$set:{更改的数据}} ,callback)
db.collection("user").updateOne({"name":"哈哈"},{$set:{
"name":"哈哈一笑"
}},function(){
if(err){
res.send("数据库写入失败");
return;
}
res.write("恭喜,数据修改成功");
res.end();
//关闭数据库
db.close();
})
})删除数据 deleteOne removeOne
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19MongoClient.connect(DBurl,function(err,db){
res.writeHead(200,{"Content-Type":"text/html;charset=UTF8" });
if(err){
res.send("数据库连接失败");
return;
}
//修改一条数据 ({要修改的数据},{$set:{更改的数据}} ,callback)
db.collection("user").deleteOne({"name":"哈哈一笑"},function(err,data){
if(err){
res.send("数据库删除失败");
return;
}
console.log(data);
res.write("恭喜,数据删除成功");
res.end();
//关闭数据库
db.close();
})
})路由根据参数动态删除数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26var url = requier('url')
app.get('/delect',function(req,res){
//删除数据 http://localhost:3000/delect?name=zhangsan
var query = url.parse(req.url,true).query//拿到url传的参数中的query
var name = query.name;//拿到?后边的参数zhangsan
MongoClient.connect(DBurl,function(err,db){
res.writeHead(200,{"Content-Type":"text/html;charset=UTF8" });
if(err){
res.send("数据库连接失败");
return;
}
//修改一条数据 ({要修改的数据},{$set:{更改的数据}} ,callback)
db.collection("user").deleteOne({"name":name},function(err,data){
if(err){
res.send("数据库删除失败");
return;
}
console.log(data);
res.write("恭喜,数据删除成功");
res.end();
//关闭数据库
db.close();
})
})
})查询数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21app.get('/find',function(req,res){
MongoClient.connect(DBurl,function(err,db){
res.writeHead(200,{"Content-Type":"text/html;charset=UTF8" });
if(err){
res.send("数据库连接失败");
return;
}
const result = db.collection('user')
result.find({}).toArray(function(err, docs) {
if(err){
res.write("游标遍历错误");
return;
}
console.log(docs);
//ejs模板引擎
ejs.renderFile('views/index.ejs',{list:docs},function(err,data){
res.send(data)
})
});
})
})将数据渲染到views/index.ejs页面上
1
2
3
4
5<ul>
<%for(var i=0;i<list.length;i++){%>
<li><%=list[i].name%></li>
<%}%>
</ul>each方法不过现在应该是不用了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26app.get('/find',function(req,res){
MongoClient.connect(DBurl,function(err,db){
res.writeHead(200,{"Content-Type":"text/html;charset=UTF8" });
if(err){
res.send("数据库连接失败");
return;
}
var list = [] /*放数据库里查询的所有数据*/
const result = db.collection('user').find({});
result.each(function(err, docs){
if(err){
res.write("游标遍历错误");
return;
}else{
if(docs!=null){
list.push(docs)
}else{
console.log(list);
ejs.renderFile('views/index.ejs',{list:list},function(err,data){
res.send(data)
})
}
}
})
})
})mongodb 3.1和2.x的区别
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23var MongoClient = require('mongodb').MongoClient;
var dbUrl = 'mongodb://localhost:27017/';//数据库地址
var dbName = 'koa'//数据库名称
//连接数据库 不加{ useNewUrlParser: true }会报错
MongoClient.connect(dbUrl,{ useNewUrlParser: true },(err,client)=>{
if(err){
console.log('连接失败');
return;
}
var db=client.db(dbName);//选择数据库名称
//增加数据
db.collection('user').insertOne({
'username':"wangwu",
'age':26,'sex':"男",
"status":"1"
},function(err,result){
if(!err){
console.log('增加数据成功');
client.close();//关闭数据库
}
})
})查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16MongoClient.connect(DBurl,function(err,client){
if(err){
res.send("数据库连接失败");
return;
}
var db=client.db(dbName);//选择数据库名称
//查询数据
const result = db.collection('user').find({})
result.toArray(function(err, docs) {
if(err){
res.write("游标遍历错误");
return;
}
console.log(docs);
});
})连接数据库会很耗性能 每次请求都要连接数据库在关闭数据库在每次连接数据库的时候都会耗时1秒左右