初尝 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 });
View Code

感谢:

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
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自www.cnblogs.com/13hua/p/10318229.html