初尝 mongodb+node.js
前言:你们这些不好好写接口的后台,非要逼着前端一统天下。纯属开玩笑哈,第一次写跟后台相关的东西,当揭开后台神秘的面纱的时候,那种惊喜、开心、成就感让我重回当初写出第一个hello world的时候。
由于我是用的是win10系统就以windows为基础说啊,linux和mac os的自行解决哈,不过应该也是大同小异的。
1. 安装
mongodb的下载和安装就不说了啊,还没有下载安装的自行去Mongodb 官网下载安装即可。
2.创建data
这部分内容主要参考 NodeJS+Express+MongoDB 这篇文章,我主要说一下踩到的坑和遇到的错误处理
安装好之后,在根目录下创建data文件夹,我是放在e盘里的。
e:\data\db用于存放mongodb的数据文件
e:\data\log用于存放mongodb的日志文件
错误处理
1. 使用net start mongodb命令启动MongoDB服务发生系统错误,返回值为5
解决方法:cmd使用管理员身份打开即可,到C:\Windows\System32找到cmd.exe然后以管理员的身份运行。为了避免每次启 动都要查找一次cmd文件,我把cmd放在了开始菜单里,右键固定在开始菜单就好了。
2. 使用net start mongodb命令启动mongodb系统出错。 发生系统错误 1067。 进程意外终止。
解决方法:MongoDB安装目录\data\将此文件夹下的mongod.lock删除,我没有遇到这个问题,也不知道能不能正确解决,有踩过坑的可以说一下。
3. 使用net stop mongodb命令启动mongodb系统出错。 发生系统错误 1067。 进程意外终止。
我在start的时候是正常启动的,但是在stop的时候报错了,但是最后还是正常stop了,上面所说的mongod.lock或者mongod.cfg我都没有,也不知道如何解决,知道怎么解决的大佬还请赐教,谢谢,鞠躬鞠躬!
注:解决了之后一定要重启服务才会生效哦。
3.启动
还是继续参考上面的那篇文章
1.命令行
## 开始服务
net start mongodb
## 停止服务 nginxstop并不会关闭服务,需要使用kill,事实证明win10下stop是可以正常停止服务的
net stop mongodb
2.在mongodb的安装目录下,E:\Program Files\MongoDB\Server\3.4\bin 下的mongo.exe文件 ,也可以放在开始里面,右键固定在开始菜单就好了
3.可视化工具robomongo
下载传送门 选择 Robo 3T 即可,选择第二个绿色版本即可,下载下来解压直接运行.exe文件就可以了,当然了这个也可以放在开始,右键固定在开始菜单就好了。
4.管理员
参考 NodeJS入门——准备工作(2)——MongoDB安装以及客户端Robomongo安装和使用
1.重新打开一个命令行窗口,切换到Mongodb安装路径下bin文件夹内
2.输入命令: mongo,输入命令 use admin切换到admin数据库
3.输入命令 db.addUser('admin','admin') 添加管理员账户 这是以前的版本
新版本应使用 ad.createUser({user:"admin",pwd:"admin",roles:[]})
5.数据库操作
使用robo3T robomongo工具
1.创建和删除数据库
可以使用图形界面右键create database创建数据库,右键Drop Database删除数据库
也可以使用命令行来操作:
1.创建数据库gomall: use gomall
db
2.删除数据库gomall:use gomall
db.dropDatabase()
2.数据库操作命令:
先打开shell脚本编写界面
1.insert:
命令:db.表名.insert(数据);
例子:db.products.insert({name:"iphone",price:1988});
说明:insert操作会自动创建products表,_id,是mongodb自已生成的,每行数据都会存在,默认是ObjectId,可以在插入数据时插入这个键的值(支持mongodb支持的所有数据类型)
查看数据:db.getCollection('products').find({});
3.2 版本后还有以下几种语法可用于插入文档:
db.collection.insertOne():向指定集合中插入一条文档数据
db.collection.insertMany():向指定集合中插入多条文档数据
2.save
命令:db.表名.save.(数据);
例子:db.proctus.save({_id:2,name:"HuaWei P10",price:2999});
说明:_id可以自已插入、一个表中不一定要字段都相同,虽然insert和save方法都可以插入数据,当默认的“_id”值已存在时,调用insert方法插入会报错;而save方法不会,会更新相同的_id所在行数据的信息。
3.批量添加
for(var i = 0; i < 5; i ++) db.users.save({'_id':i,'name':'zhangguo'+i,'age':i+8});
for(let i = 0; i < 5; i ++) db.users.save({'_id':i,'name':`zhangguo${i}`,'age':i+8});
4.查询数据
1.查询集合中所有数据
命令: db.集合.find();
例子:db.users.find({name:'zhangguo0'});
db.getCollection('users').find({});
db.users.find({});
db.users.find();
其中,例子的后面三种写法是相同的结果
2.按条件查询(支持多条件)
命令:db.集合.find(条件);
例子:db.users.find({name:'zhangguo0',age:9})
说明:对象中的条件要求同时成立
3.查询第一条(支持条件)
命令:db.集合.findOne(条件);
例子:db.users.findOne({name:'zhangguo0'});
4.限制数量
命令: db.集合.find().limit(数量);
例子: db.users.find({}).limit(3); 或 db.users.find().limit(3); 结果一样
5.跳过指定数量
命令: db.表名.find().skip(数量);
例子: db.users.find({}).skip(3);
db.users.find({}).skip(2).limit(2);
6.比较查询
不同类型不会作比较,string和number不会作比较
1.等于:$eq
格式:{<key>:<value>}
{<key>:{$eq:<value>}}
例子:db.users.find({age:10});
db.users.find({age:{$eq:10}});
说明:这两种格式的结果是一样的
2.大于: $gt
格式:{<key>:{$gt:<value>}}
例子:db.users.find({age:{$gt:10}});
3.大于等于: $gte
格式:{<key>:{$gte:<value>}}
例子:db.users.find({age:{$gte:10}});
4.小于: $lt
格式:{<key>:{$lt:<value>}}
例子:db.users.find({age:{$lt:10}});
5.小于等于: $lte
格式:{<key>:{$lte:<value>}}
例子:db.users.find({age:{$lte:10}});
6.不等于: $ne
格式:{<key>:{$ne:<value>}}
例子:db.users.find({age:{$ne:10}});
7.查询数量
语法:db.表名.find().count();
例子:db.users.find({}).count()
8.排序
语法:db.表名.find().sort({"字段名":1});
例子:db.users.find({}).sort({}) 不能写成db.users.find({}).sort()会报错 "Failed to parse: sort: undefined. 'sort' field must be of BSON type object."
db.users.find({}).sort({age:-1,name:1});
说明:1:表示升序;-1:表示降序;db.users.find({}).sort({}) 什么都不传按默认排序,默认是_id升序排序
9.指定字段返回
语法:db.表名.find({},{"字段名":0});
例子:db.users.find({age:{$gt:9}},{_id:0,age:1,name:1});
说明: 参数 1:返回 0:不返回
5.修改
1.修改符合条件的第一条:update
语法:db.集合.update({"条件字段名":"字段值"},{$set:{"要修改的字段名":"修改后的字段值"}});
例子:db.users.update({age:{$eq:9}},{$set:{age:100}});
db.users.update({age:9},{$set:{age:100}});
说明:这两种格式的例子结果是一样的。前面save在_id字段已存在是就是修改操作。
2.修改多条:updateMany
例子: db.users.updateMany({age:{$gt:10}},{$set:{age:20}});
6.删除
语法:db.集合.remove(条件);
例子:db.users.remove({age:{$gte:10}}); // 删除年龄>=10岁的数据
6.node.js访问Mongodb
前提:先用nodejs新建一个简单的项目
在当前项目中引入mongodb,可以不用全局安装的。
npm install mongodb --save
在项目的根目录下新建一个db.js文件,使用Node.js操作MongoDB。写完之后运行 node db.js 即可。
下面附上Node.js操作MongoDB的完整代码。主要主义的点是2.x和3.0以上的版本api接口有一点出入
1 // 引入客户端mongodb模块,获得客户端对象 2 const MongoClient = require('mongodb').MongoClient; 3 // 连接字符串 4 const DB_CONN_STR = 'mongodb://localhost:27017/gomall'; 5 6 // 添加数据 7 const insertData = function (db, callback) { 8 // 获得指定的集合 9 let collection = db.collection('users'); 10 // 插入数据 11 let data = [{ 12 _id: 9, 13 name: 'rose', 14 age: 23 15 }, { 16 _id: 10, 17 name: 'mark', 18 age: 24 19 }]; 20 21 // collection.insert(data, function (err, result) { // mongodb 2.x的写法 22 collection.insertMany(data, function (err, result) { 23 // 如果存在错误 24 if (err) { 25 console.error('Error:', err); 26 return; 27 } 28 29 // 调用传入的回调方法,将操作结果返回 30 callback(result); 31 }); 32 } 33 34 // 修改数据 35 const updateData = function (db, callback) { 36 // 获得指定的集合 37 let collection = db.collection('users'); 38 // 要修改数据的条件,>=10岁的用户 39 let where = { 40 age: { 41 $gte: 10 42 } 43 }; 44 // 要修改的结果 45 let set = { 46 $set: { 47 age: 95 48 } 49 }; 50 51 collection.updateMany(where, set, function (err, result) { 52 // 如果存在错误 53 if (err) { 54 console.error('Error:', err); 55 return; 56 } 57 // 调用传入的回调方法,将操作结果返回 58 callback(result); 59 }) 60 } 61 62 // 查询数据 63 const findData = function (db, callback) { 64 let collection = db.collection('users'); 65 let where = { 66 age: { 67 $eq: '22' 68 } 69 }; 70 let set = { 71 name: 1, 72 age: 1 73 }; 74 75 collection.find(where, set).toArray(function (err, result) { 76 if (err) { 77 console.error('Error:', err); 78 return; 79 } 80 callback(result); 81 }); 82 83 // 删除数据 84 const deleteData = function (db, callback) { 85 let collection = db.collection('users'); 86 let where = { 87 age: { 88 $eq: '21' 89 } 90 }; 91 collection.remove(where, function (err, result) { 92 if (err) { 93 console.error('Error:', err); 94 return; 95 } 96 console.log(result); 97 callback(result); 98 }) 99 } 100 101 102 103 } 104 105 //使用客户端连接数据,并指定完成时的回调方法 106 // MongoClient.connect(DB_CONN_STR, function (err, db) { // 2.x的写法 107 MongoClient.connect(DB_CONN_STR, { 108 useNewUrlParser: true 109 }, function (err, client) { //// 3.0的写法 110 if (err) { 111 console.error('数据库连接失败'); 112 return; 113 } 114 console.log('连接成功'); 115 // 执行插入数据操作,调用自定义方法 116 let db = client.db('gomall'); // 3.0的写法 117 insertData(db, function (result) { 118 // 显示结果 119 console.log(result); 120 // 关闭数据库 121 client.close(); 122 }); 123 124 updateData(db, function (result) { 125 // 显示结果 126 console.log(result); 127 client.close(); 128 }); 129 130 findData(db, function (result) { 131 console.log(result); 132 client.close(); 133 }); 134 deleteData(db, function (result) { 135 console.log(result); 136 client.close(); 137 }) 138 });
感谢:
1. https://www.cnblogs.com/best/p/6212807.html
2.https://www.cnblogs.com/zhaord/p/4229001.html
3.https://blog.csdn.net/u010523770/article/details/54599548
4.http://www.runoob.com/mongodb/mongodb-query.html
是你们在我黑暗的路上打开了一盏路灯,谢谢!
以上就是我的踩坑记录,愿对你也有所帮助。
愿圣光与你同在
---------------------
作者:十三画13
来源:CSDN
原文:https://blog.csdn.net/daiqisi/article/details/86630992
版权声明:本文为博主原创文章,转载请附上博文链接!